home *** CD-ROM | disk | FTP | other *** search
/ Acorn RISC PD-CD 1 / Acorn RISC PD-CD 1.iso / languages / gawk / c / awktab < prev    next >
Encoding:
Text File  |  1991-02-05  |  88.2 KB  |  2,837 lines

  1. /*  A Bison parser, made from awk.y  */
  2.  
  3. #define    FUNC_CALL    258
  4. #define    NAME    259
  5. #define    REGEXP    260
  6. #define    ERROR    261
  7. #define    NUMBER    262
  8. #define    YSTRING    263
  9. #define    RELOP    264
  10. #define    APPEND_OP    265
  11. #define    ASSIGNOP    266
  12. #define    MATCHOP    267
  13. #define    NEWLINE    268
  14. #define    CONCAT_OP    269
  15. #define    LEX_BEGIN    270
  16. #define    LEX_END    271
  17. #define    LEX_IF    272
  18. #define    LEX_ELSE    273
  19. #define    LEX_RETURN    274
  20. #define    LEX_DELETE    275
  21. #define    LEX_WHILE    276
  22. #define    LEX_DO    277
  23. #define    LEX_FOR    278
  24. #define    LEX_BREAK    279
  25. #define    LEX_CONTINUE    280
  26. #define    LEX_PRINT    281
  27. #define    LEX_PRINTF    282
  28. #define    LEX_NEXT    283
  29. #define    LEX_EXIT    284
  30. #define    LEX_FUNCTION    285
  31. #define    LEX_GETLINE    286
  32. #define    LEX_IN    287
  33. #define    LEX_AND    288
  34. #define    LEX_OR    289
  35. #define    INCREMENT    290
  36. #define    DECREMENT    291
  37. #define    LEX_BUILTIN    292
  38. #define    LEX_LENGTH    293
  39. #define    UNARY    294
  40.  
  41. #line 26 "awk.y"
  42.  
  43. #ifdef DEBUG
  44. #define YYDEBUG 12
  45. #else
  46. #define YYDEBUG 0
  47. #endif
  48.  
  49. #include "awk.h"
  50.  
  51. /*
  52.  * This line is necessary since the Bison parser skeleton uses bcopy.
  53.  * Systems without memcpy should use -DMEMCPY_MISSING, per the Makefile.
  54.  * It should not hurt anything if Yacc is being used instead of Bison.
  55.  */
  56. #define bcopy(s,d,n)    memcpy((d),(s),(n))
  57.  
  58. extern void msg();
  59. extern struct re_pattern_buffer *mk_re_parse();
  60.  
  61. NODE *node();
  62. NODE *lookup();
  63. NODE *install();
  64.  
  65. static NODE *snode();
  66. static NODE *mkrangenode();
  67. static FILE *pathopen();
  68. static NODE *make_for_loop();
  69. static NODE *append_right();
  70. static void func_install();
  71. static NODE *make_param();
  72. static int hashf();
  73. static void pop_params();
  74. static void pop_var();
  75. static int yylex ();
  76. static void yyerror(char *mesg, ...);
  77. /***********************
  78. static void yyerror();
  79. ***********************/
  80. static int want_regexp;        /* lexical scanning kludge */
  81. static int want_assign;        /* lexical scanning kludge */
  82. static int can_return;        /* lexical scanning kludge */
  83. static int io_allowed = 1;    /* lexical scanning kludge */
  84. static int lineno = 1;        /* for error msgs */
  85. static char *lexptr;        /* pointer to next char during parsing */
  86. static char *lexptr_begin;    /* keep track of where we were for error msgs */
  87. static int curinfile = -1;    /* index into sourcefiles[] */
  88. static int param_counter;
  89.  
  90. NODE *variables[HASHSIZE];
  91.  
  92. extern int errcount;
  93. extern NODE *begin_block;
  94. extern NODE *end_block;
  95.  
  96. #line 77 "awk.y"
  97. typedef union {
  98.     long lval;
  99.     AWKNUM fval;
  100.     NODE *nodeval;
  101.     NODETYPE nodetypeval;
  102.     char *sval;
  103.     NODE *(*ptrval)();
  104. } YYSTYPE;
  105.  
  106. #ifndef YYLTYPE
  107. typedef
  108.   struct yyltype
  109.     {
  110.       int timestamp;
  111.       int first_line;
  112.       int first_column;
  113.       int last_line;
  114.       int last_column;
  115.       char *text;
  116.    }
  117.   yyltype;
  118.  
  119. #define YYLTYPE yyltype
  120. #endif
  121.  
  122. #define    YYACCEPT    return(0)
  123. #define    YYABORT    return(1)
  124. #define    YYERROR    goto yyerrlab
  125. #include <stdio.h>
  126.  
  127. #ifndef __STDC__
  128. #define const
  129. #endif
  130.  
  131.  
  132.  
  133. #define    YYFINAL        298
  134. #define    YYFLAG        -32768
  135. #define    YYNTBASE    61
  136.  
  137. #define YYTRANSLATE(x) ((unsigned)(x) <= 294 ? yytranslate[x] : 105)
  138.  
  139. static const char yytranslate[] = {     0,
  140.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  141.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  142.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  143.      2,     2,    49,     2,     2,    52,    48,     2,     2,    53,
  144.     54,    46,    44,    60,    45,     2,    47,     2,     2,     2,
  145.      2,     2,     2,     2,     2,     2,     2,    40,    59,    41,
  146.      2,    42,    39,     2,     2,     2,     2,     2,     2,     2,
  147.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  148.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  149.     55,     2,    56,    51,     2,     2,     2,     2,     2,     2,
  150.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  151.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  152.      2,     2,    57,    43,    58,     2,     2,     2,     2,     2,
  153.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  154.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  155.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  156.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  157.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  158.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  159.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  160.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  161.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  162.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  163.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  164.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  165.      2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
  166.      6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
  167.     16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
  168.     26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
  169.     36,    37,    38,    50
  170. };
  171.  
  172. static const short yyrline[] = {     0,
  173.    136,   141,   149,   165,   166,   170,   172,   186,   188,   202,
  174.    208,   214,   216,   218,   220,   229,   231,   236,   240,   248,
  175.    257,   259,   268,   270,   281,   286,   291,   293,   301,   303,
  176.    308,   310,   316,   318,   320,   322,   324,   326,   328,   333,
  177.    337,   342,   345,   348,   350,   352,   355,   356,   358,   360,
  178.    362,   364,   369,   371,   376,   381,   388,   390,   395,   397,
  179.    402,   404,   409,   411,   413,   415,   420,   422,   427,   429,
  180.    431,   433,   435,   441,   443,   448,   450,   455,   457,   463,
  181.    465,   467,   469,   474,   476,   481,   483,   489,   491,   493,
  182.    495,   500,   503,   504,   506,   511,   520,   522,   524,   526,
  183.    528,   530,   532,   534,   536,   538,   540,   542,   547,   550,
  184.    551,   553,   555,   564,   566,   568,   570,   572,   574,   576,
  185.    578,   583,   585,   587,   589,   591,   593,   597,   599,   601,
  186.    603,   605,   607,   609,   613,   615,   617,   619,   621,   623,
  187.    625,   627,   632,   634,   639,   641,   643,   648,   652,   656,
  188.    660,   661,   665,   668
  189. };
  190.  
  191. static const char * const yytname[] = {     "",
  192. "error","$illegal.","FUNC_CALL","NAME","REGEXP","ERROR","NUMBER","YSTRING","RELOP","APPEND_OP",
  193. "ASSIGNOP","MATCHOP","NEWLINE","CONCAT_OP","LEX_BEGIN","LEX_END","LEX_IF","LEX_ELSE","LEX_RETURN","LEX_DELETE",
  194. "LEX_WHILE","LEX_DO","LEX_FOR","LEX_BREAK","LEX_CONTINUE","LEX_PRINT","LEX_PRINTF","LEX_NEXT","LEX_EXIT","LEX_FUNCTION",
  195. "LEX_GETLINE","LEX_IN","LEX_AND","LEX_OR","INCREMENT","DECREMENT","LEX_BUILTIN","LEX_LENGTH","'?'","':'",
  196. "'<'","'>'","'|'","'+'","'-'","'*'","'/'","'%'","'!'","UNARY",
  197. "'^'","'$'","'('","')'","'['","']'","'{'","'}'","';'","','",
  198. "start"
  199. };
  200.  
  201. static const short yyr1[] = {     0,
  202.     61,    62,    62,    62,    62,    64,    63,    65,    63,    63,
  203.     63,    63,    63,    63,    63,    66,    66,    68,    67,    69,
  204.     70,    70,    72,    71,    73,    73,    74,    74,    74,    74,
  205.     75,    75,    76,    76,    76,    76,    76,    76,    76,    76,
  206.     76,    76,    76,    76,    76,    77,    76,    76,    78,    76,
  207.     76,    76,    79,    79,    80,    80,    81,    81,    82,    82,
  208.     83,    83,    84,    84,    84,    84,    85,    85,    86,    86,
  209.     86,    86,    86,    87,    87,    88,    88,    89,    89,    89,
  210.     89,    89,    89,    90,    90,    91,    91,    91,    91,    91,
  211.     91,    93,    92,    92,    92,    92,    92,    92,    92,    92,
  212.     92,    92,    92,    92,    92,    92,    92,    92,    95,    94,
  213.     94,    94,    94,    94,    94,    94,    94,    94,    94,    94,
  214.     94,    96,    96,    96,    96,    96,    96,    96,    96,    96,
  215.     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
  216.     96,    96,    97,    97,    98,    98,    98,    99,   100,   101,
  217.    102,   102,   103,   104
  218. };
  219.  
  220. static const short yyr2[] = {     0,
  221.      3,     1,     2,     1,     2,     0,     3,     0,     3,     2,
  222.      2,     2,     1,     2,     2,     1,     1,     0,     7,     3,
  223.      1,     3,     0,     4,     3,     4,     1,     2,     1,     2,
  224.      1,     2,     2,     2,     3,     1,     6,     8,     8,    10,
  225.      9,     2,     2,     6,     4,     0,     3,     3,     0,     4,
  226.      6,     2,     1,     1,     6,     9,     1,     2,     0,     1,
  227.      0,     2,     0,     2,     2,     2,     0,     1,     1,     3,
  228.      1,     2,     3,     0,     1,     0,     1,     1,     3,     1,
  229.      2,     3,     3,     0,     1,     1,     3,     1,     2,     3,
  230.      3,     0,     4,     5,     4,     3,     3,     3,     3,     1,
  231.      2,     3,     3,     3,     3,     5,     1,     2,     0,     4,
  232.      3,     3,     3,     1,     2,     3,     3,     3,     5,     1,
  233.      2,     2,     3,     4,     4,     1,     4,     2,     2,     2,
  234.      2,     1,     1,     1,     3,     3,     3,     3,     3,     3,
  235.      2,     2,     0,     1,     1,     4,     2,     2,     2,     1,
  236.      0,     1,     1,     2
  237. };
  238.  
  239. static const short yydefact[] = {    59,
  240.     57,    60,     0,    58,     4,     0,   145,   133,   134,     6,
  241.      8,    18,   143,     0,     0,     0,   126,     0,     0,    23,
  242.      0,     0,     0,    59,     0,     2,     0,     0,   100,    13,
  243.     21,   107,   132,     0,     0,     0,   153,     0,    10,    31,
  244.     59,     0,    11,     0,    61,   144,   128,   129,     0,     0,
  245.      0,     0,   142,   132,   141,     0,   101,   122,   147,    88,
  246.      0,    86,   148,     5,     3,     1,    15,     0,    12,    14,
  247.      0,     0,     0,     0,     0,     0,     0,     0,     0,    59,
  248.    108,     0,     0,     0,     0,     0,     0,     0,    92,   130,
  249.    131,    29,     0,    49,     0,     0,    59,     0,     0,     0,
  250.     53,    54,    46,    74,    59,     0,    27,     0,    36,     0,
  251.      0,   151,    59,     0,     0,    86,     0,     7,    32,     9,
  252.     17,    16,     0,     0,    96,     0,     0,     0,     0,    89,
  253.    150,     0,     0,   123,     0,   103,    99,   102,    97,    98,
  254.      0,   104,   105,   143,   154,    22,   139,   140,   136,   137,
  255.    138,   135,     0,     0,    74,     0,     0,     0,    74,    42,
  256.     43,     0,     0,    75,   149,    30,    28,   151,    80,   143,
  257.      0,     0,   114,    63,     0,    78,   120,   132,    52,     0,
  258.     34,    25,   152,    33,   127,   146,     0,    62,   124,   125,
  259.     24,    90,     0,    91,    87,    20,     0,    95,    93,     0,
  260.      0,     0,     0,     0,   145,     0,    47,    48,    26,    61,
  261.    115,     0,     0,     0,     0,     0,    81,     0,     0,     0,
  262.      0,     0,     0,     0,   121,   109,    35,    71,    69,     0,
  263.      0,    94,   106,    59,    50,     0,    59,     0,     0,     0,
  264.    113,    63,    65,    64,    66,    45,    82,    83,    79,   118,
  265.    116,   117,   111,   112,     0,     0,    59,    72,     0,     0,
  266.      0,     0,     0,     0,     0,    74,     0,     0,   110,    19,
  267.     73,    70,    55,    51,    37,     0,    59,    74,     0,    44,
  268.    119,    59,    59,     0,     0,    59,     0,    38,    39,    59,
  269.      0,    56,     0,    41,    40,     0,     0,     0
  270. };
  271.  
  272. static const short yydefgoto[] = {   296,
  273.     25,    26,    38,    42,   123,    27,    44,    67,    28,    29,
  274.     56,    30,   106,    39,   107,   162,   155,   108,   109,     2,
  275.      3,   125,   216,   230,   231,   163,   174,   175,   114,   115,
  276.     81,   153,   225,   256,    32,    45,    33,   111,   112,   134,
  277.    182,   113,   133
  278. };
  279.  
  280. static const short yypact[] = {    21,
  281. -32768,    37,  1020,-32768,-32768,   -32,     1,-32768,-32768,    17,
  282.     17,-32768,    11,    11,    11,    31,    45,  1757,  1757,-32768,
  283.   1738,  1757,  1112,    21,   540,-32768,    13,    40,-32768,-32768,
  284.    816,   142,    55,   612,  1092,  1112,-32768,    13,-32768,    37,
  285.     21,    13,-32768,    51,    59,-32768,-32768,-32768,  1092,  1092,
  286.   1757,  1625,    27,    -7,    27,    97,-32768,    27,-32768,-32768,
  287.      4,  1225,-32768,-32768,-32768,-32768,-32768,   706,-32768,-32768,
  288.   1625,  1625,   100,  1625,  1625,  1625,  1625,  1625,    76,    21,
  289.    300,  1625,  1757,  1757,  1757,  1757,  1757,  1757,-32768,-32768,
  290. -32768,-32768,    52,-32768,   109,    62,    21,    64,    17,    17,
  291. -32768,-32768,-32768,  1625,    21,   659,-32768,   763,-32768,   920,
  292.    612,    65,    21,    67,     7,  1324,    25,-32768,-32768,-32768,
  293. -32768,-32768,    70,  1757,-32768,    67,    67,  1225,    84,  1625,
  294. -32768,   101,  1159,-32768,   659,  1811,  1796,-32768,  1465,  1371,
  295.   1277,  1811,  1811,    11,-32768,  1324,   -10,   -10,    27,    27,
  296.     27,    27,  1625,  1625,  1625,    87,  1625,   863,  1672,-32768,
  297. -32768,    17,    17,  1324,-32768,-32768,-32768,    65,-32768,    11,
  298.   1738,  1112,-32768,     9,     0,  1512,   142,    83,-32768,   659,
  299. -32768,-32768,-32768,-32768,-32768,-32768,     8,   142,-32768,-32768,
  300. -32768,  1324,   134,-32768,  1324,-32768,  1625,-32768,  1324,  1225,
  301.     17,  1112,  1225,   122,   -16,    65,-32768,-32768,-32768,    59,
  302. -32768,     4,  1625,  1625,  1625,    17,  1691,  1178,  1691,  1691,
  303.    140,  1691,  1691,  1691,   939,-32768,-32768,-32768,-32768,    67,
  304.     23,-32768,  1324,    21,-32768,    26,    21,    94,   144,  1045,
  305. -32768,     9,  1324,  1324,  1324,-32768,  1512,-32768,  1512,   782,
  306.   1858,-32768,  1606,  1559,  1418,  1691,    21,-32768,    44,   863,
  307.     17,   863,  1625,    67,   973,  1625,    17,  1691,  1512,-32768,
  308. -32768,-32768,   131,-32768,-32768,  1225,    21,  1625,    67,-32768,
  309.   1512,    21,    21,   863,    67,    21,   863,-32768,-32768,    21,
  310.    863,-32768,   863,-32768,-32768,   163,   166,-32768
  311. };
  312.  
  313. static const short yypgoto[] = {-32768,
  314. -32768,   145,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   201,
  315. -32768,    78,   -54,    12,   225,-32768,-32768,-32768,-32768,   363,
  316.    104,   -39,   -70,-32768,-32768,  -152,-32768,-32768,    60,   -19,
  317.     -3,-32768,   -83,-32768,   146,  -126,    74,   178,  -100,   319,
  318.     10,   329,   -29
  319. };
  320.  
  321.  
  322. #define    YYLAST        1911
  323.  
  324.  
  325. static const short yytable[] = {    31,
  326.    217,    82,   201,    61,   130,   168,   206,   130,   228,   -77,
  327.    181,   229,   -77,   135,     7,   239,   117,   198,   213,    62,
  328.     35,    31,    43,   258,   176,   130,   130,    90,    91,     1,
  329.    110,   116,   116,     1,   196,    85,    86,    87,    36,    70,
  330.     88,   -77,   -77,   210,   271,   116,   116,   272,   128,     4,
  331.    214,   215,     1,   121,   122,    36,   180,   131,   -77,    80,
  332.    -85,   -67,    22,    80,   110,    89,    80,   136,   137,    24,
  333.    139,   140,   141,   142,   143,    37,   -68,    88,   146,   227,
  334.    186,   261,    80,    49,    80,    80,    46,    47,    48,    90,
  335.     91,    54,    54,   226,    54,    54,    24,    50,    37,   124,
  336.    164,   129,   110,   138,   154,    69,   144,   110,   126,   127,
  337.    160,   161,   156,   279,   157,   118,   159,    90,    91,   120,
  338.    131,   179,   187,    37,    54,   285,   192,    63,    66,   195,
  339.    191,   110,   193,   247,   249,   250,   251,   232,   253,   254,
  340.    255,   202,   238,   252,   119,   218,   263,   264,   282,   199,
  341.    200,   164,   212,   203,   110,   164,    54,    54,    54,    54,
  342.     54,    54,   297,    53,    55,   298,    58,    59,    62,    65,
  343.    241,   267,   269,   207,   208,     0,   110,   209,     0,     0,
  344.     34,   178,   236,   145,   281,    83,    84,    85,    86,    87,
  345.      0,     0,    88,   233,     0,     0,    58,    54,   116,     0,
  346.    158,   259,    34,     0,    68,    34,     0,     0,   165,   243,
  347.    244,   245,   235,     0,     0,    34,   184,    46,     0,    34,
  348.      0,    57,     0,     0,     0,     0,     0,   246,   147,   148,
  349.    149,   150,   151,   152,     0,     0,   265,     0,     0,     0,
  350.      0,     0,     0,    46,    54,     0,     0,     0,     0,   178,
  351.      0,     0,     0,   177,     0,     0,   110,     0,   110,   276,
  352.      0,     0,   164,     0,     0,     0,     0,     0,     0,   188,
  353.      0,     0,   274,     0,   164,     0,     0,     0,   280,     0,
  354.    110,     0,     0,   110,     0,     0,     0,   110,     0,   110,
  355.    178,   178,   178,   178,     0,   178,   178,   178,   178,     0,
  356.      0,     0,     0,     7,     0,     0,     8,     9,   173,     0,
  357.      0,     0,     0,     0,     0,     0,    58,     0,     0,     0,
  358.    178,   177,   178,   178,   178,     0,   178,   178,   178,   178,
  359.    167,     0,     0,     0,    14,    15,     0,   260,    41,    41,
  360.    262,   178,   178,    18,    19,     0,    20,     0,    21,     0,
  361.      0,    22,    23,     0,   178,     0,    41,     0,     0,   167,
  362.    270,     0,   177,   177,   177,   177,     0,   177,   177,   177,
  363.    177,   211,    40,    40,     0,     0,   173,     0,     0,   132,
  364.    284,     0,   204,     0,     0,   287,   288,     0,     0,   291,
  365.     40,     0,   177,   293,   177,   177,   177,     0,   177,   177,
  366.    177,   177,     0,     0,   167,     0,     0,     0,     0,     0,
  367.      0,     0,     0,   177,   177,     0,     0,   173,   173,   173,
  368.    173,     0,   173,   173,   173,   173,   177,    41,    41,     0,
  369.      0,     0,   185,     0,     0,     0,     0,     0,    41,     0,
  370.    183,     0,     0,     0,   189,   190,     0,   173,     0,   173,
  371.    173,   173,     0,   173,   173,   173,   173,     0,     0,     0,
  372.      0,    40,    40,     0,     0,     0,     0,     0,   173,   173,
  373.      0,     0,    40,     0,     0,     0,     0,     0,     0,     0,
  374.      0,   173,     0,     0,   273,     0,   275,     0,     0,     0,
  375.     41,    41,     0,     0,     0,     0,   183,     0,     0,     0,
  376.      0,     0,     0,     0,     0,     0,     0,     0,   289,     0,
  377.      0,   292,     0,     0,     0,   294,     0,   295,   234,     0,
  378.      0,   237,     0,     0,    40,    40,     0,     0,     0,    41,
  379.    242,     0,     0,     0,   240,     0,     0,     0,     0,   -59,
  380.     64,     0,     6,     7,    41,     0,     8,     9,   257,     0,
  381.      0,     0,     1,     0,    10,    11,     0,     0,     0,     0,
  382.      0,     0,     0,    40,     0,     0,     0,     0,   266,    12,
  383.     13,     0,     0,     0,    14,    15,    16,    17,    40,     0,
  384.      0,     0,   277,    18,    19,     0,    20,     0,    21,    41,
  385.      0,    22,    23,   278,   283,    41,    24,   286,     0,     0,
  386.      0,     0,     0,   290,     0,     0,     0,     0,     0,     0,
  387.      0,     0,    92,     0,     6,     7,     0,     0,     8,     9,
  388.      0,     0,     0,    40,     0,     0,     0,     0,    93,    40,
  389.     94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
  390.    104,     0,    13,     0,     0,     0,    14,    15,    16,    17,
  391.      0,     0,     0,     0,     0,    18,    19,     0,    20,   166,
  392.     21,     6,     7,    22,    23,     8,     9,     0,    24,   105,
  393.     37,     0,     0,     0,     0,    93,     0,    94,    95,    96,
  394.     97,    98,    99,   100,   101,   102,   103,   104,     0,    13,
  395.      0,     0,     0,    14,    15,    16,    17,     0,     0,     0,
  396.      0,     0,    18,    19,     0,    20,    92,    21,     6,     7,
  397.     22,    23,     8,     9,     0,    24,   105,    37,     0,     0,
  398.      0,     0,    93,     0,    94,    95,    96,    97,    98,    99,
  399.    100,   101,   102,   103,   104,     0,    13,     0,     0,     0,
  400.     14,    15,    16,    17,     0,     0,     0,     0,     0,    18,
  401.     19,     0,    20,     0,    21,     0,     0,    22,    23,     0,
  402.      0,     0,    24,   169,    37,     6,     7,     0,     0,     8,
  403.      9,     0,   -76,     0,     0,   -76,     0,     0,     0,     0,
  404.      0,     0,     0,     0,     0,     7,     0,     0,     8,     9,
  405. -32768,     0,     0,   170,     0,     0,     0,    14,    15,    16,
  406.     17,     0,     0,     0,   -76,   -76,    18,    19,     0,    20,
  407.      0,   171,     0,     0,    22,   172,    14,    15,     6,     7,
  408.      0,   -76,     8,     9,    71,    18,    19,    72,    20,     0,
  409.    171,     0,     0,    22,    52,     0,     0,     0,     0,     0,
  410.      0,     0,     0,     0,     0,     0,    13,    73,    74,    75,
  411.     14,    15,    16,    17,    76,     0,    77,    78,    79,    18,
  412.     19,     0,    20,     0,    21,     6,     7,    22,    23,     8,
  413.      9,     0,     0,     0,     0,    80,     0,     0,     0,    93,
  414.      0,    94,    95,    96,    97,    98,    99,   100,   101,   102,
  415.    103,   104,     0,    13,     0,     0,     0,    14,    15,    16,
  416.     17,     0,     0,     0,     0,     0,    18,    19,     0,    20,
  417.      0,    21,     0,     0,    22,    23,     0,     0,     0,    24,
  418.      0,    37,     6,     7,     0,     0,     8,     9,    71,     0,
  419.      0,    72,     1,     0,     0,     0,     0,     0,     0,     0,
  420.      0,     0,     7,     0,     0,     8,     9,     0,     0,     0,
  421.     13,    73,    74,    75,    14,    15,    16,    17,    76,     0,
  422.     77,    78,    79,    18,    19,     0,    20,     0,    21,     0,
  423.      0,    22,    23,    14,    15,     6,     7,     0,    37,     8,
  424.      9,    71,    18,    19,    72,    20,     0,   171,     0,     0,
  425.     22,    52,     0,     0,     0,     0,     0,     0,     0,     0,
  426.      0,     0,     0,    13,    73,    74,    75,    14,    15,    16,
  427.     17,    76,     0,    77,    78,    79,    18,    19,     0,    20,
  428.      5,    21,     6,     7,    22,    23,     8,     9,     0,     0,
  429.      0,    37,     0,     0,    10,    11,     0,     0,     0,     0,
  430.      0,     0,     0,     0,     0,     0,     0,     6,     7,    12,
  431.     13,     8,     9,     0,    14,    15,    16,    17,     0,     0,
  432.      0,     0,     0,    18,    19,     0,    20,     0,    21,     0,
  433.      0,    22,    23,     0,     0,    13,    24,     0,     0,    14,
  434.     15,    16,    17,     0,     0,     0,     0,     0,    18,    19,
  435.      0,    20,    60,    21,     6,     7,    22,    23,     8,     9,
  436.      0,     0,     0,    37,     0,     0,     0,     0,     0,     0,
  437.      0,     0,    60,     0,     6,     7,     0,     0,     8,     9,
  438.      0,     0,    13,     0,     0,     0,    14,    15,    16,    17,
  439.      0,     0,     0,     0,     0,    18,    19,     0,    20,     0,
  440.     21,     0,    13,    22,    23,   -84,    14,    15,    16,    17,
  441.      0,     0,     0,     0,     0,    18,    19,     0,    20,   194,
  442.     21,     6,     7,    22,    23,     8,     9,     0,     0,     0,
  443.      0,     0,     0,     0,     0,     0,     0,     0,   248,     0,
  444.      6,     7,     0,     0,     8,     9,     0,     0,     0,    13,
  445.      0,     0,     0,    14,    15,    16,    17,     0,     0,     0,
  446.      0,     0,    18,    19,     0,    20,     0,    21,   170,     0,
  447.     22,    23,    14,    15,    16,    17,     0,     0,     0,     0,
  448.      0,    18,    19,     0,    20,     0,   171,     6,     7,    22,
  449.     52,     8,     9,    71,     0,     0,    72,     0,     0,     0,
  450.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  451.      0,     0,     0,     0,     0,    13,    73,    74,    75,    14,
  452.     15,    16,    17,    76,     0,    77,    78,    79,    18,    19,
  453.      0,    20,     0,    21,     0,     0,    22,    23,   131,     6,
  454.      7,     0,     0,     8,     9,    71,     0,     0,    72,     0,
  455.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  456.      0,     0,     0,     0,     0,     0,     0,    13,    73,    74,
  457.     75,    14,    15,    16,    17,    76,   197,    77,    78,    79,
  458.     18,    19,     0,    20,     0,    21,     6,     7,    22,    23,
  459.      8,     9,    71,     0,     0,    72,     0,     0,     0,     0,
  460.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  461.      0,     0,     0,     0,    13,    73,    74,    75,    14,    15,
  462.     16,    17,    76,     0,    77,    78,    79,    18,    19,     0,
  463.     20,     0,    21,     6,     7,    22,    23,     8,     9,    71,
  464.      0,     0,    72,     0,     0,     0,     0,     0,     0,     0,
  465.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  466.      0,    13,    73,    74,     0,    14,    15,    16,    17,     0,
  467.      0,    77,    78,    79,    18,    19,     0,    20,     0,    21,
  468.      6,     7,    22,    23,     8,     9,   219,     0,     0,   220,
  469.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  470.      0,     0,     0,     0,     0,     0,     0,     0,   170,   221,
  471.    222,   223,    14,    15,    16,    17,   224,   268,     0,     0,
  472.      0,    18,    19,     0,    20,     0,   171,     6,     7,    22,
  473.     52,     8,     9,    71,     0,     0,    72,     0,     0,     0,
  474.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  475.      0,     0,     0,     0,     0,    13,    73,     0,     0,    14,
  476.     15,    16,    17,     0,     0,    77,    78,    79,    18,    19,
  477.      0,    20,     0,    21,     6,     7,    22,    23,     8,     9,
  478.    219,     0,     0,   220,     0,     0,     0,     0,     0,     0,
  479.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  480.      0,     0,   170,   221,   222,   223,    14,    15,    16,    17,
  481.    224,     0,     0,     0,     0,    18,    19,     0,    20,     0,
  482.    171,     6,     7,    22,    52,     8,     9,   219,     0,     0,
  483.    220,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  484.      0,     0,     0,     0,     0,     0,     0,     0,     0,   170,
  485.    221,   222,     0,    14,    15,    16,    17,     0,     0,     0,
  486.      0,     0,    18,    19,     0,    20,     0,   171,     6,     7,
  487.     22,    52,     8,     9,   219,     0,     0,   220,     0,     0,
  488.      0,     0,     0,     0,     0,     0,     0,     6,     7,     0,
  489.      0,     8,     9,     0,     0,     0,   170,   221,     0,     0,
  490.     14,    15,    16,    17,     0,     0,     0,     0,     0,    18,
  491.     19,     0,    20,     0,   171,    13,     0,    22,    52,    14,
  492.     15,    16,    17,     0,     0,     0,     0,     0,    18,    19,
  493.      0,    20,     0,    21,     6,   205,    22,    23,     8,     9,
  494.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  495.      0,     0,     0,     6,     7,     0,     0,     8,     9,     0,
  496.      0,     0,    13,     0,     0,     0,    14,    15,    16,    17,
  497.      0,     0,     0,     0,     0,    18,    19,     0,    20,     0,
  498.     21,   170,     0,    22,    23,    14,    15,    16,    17,     0,
  499.      0,     0,     0,     0,    18,    19,     0,    20,     0,   171,
  500.      6,     7,    22,    52,     8,     9,     0,     0,     0,     0,
  501.      0,     0,     0,     0,     0,     0,     0,     0,     0,     6,
  502.      7,     0,     0,     8,     9,     0,     0,     0,     0,     0,
  503.      0,     0,    14,    15,    16,    17,     0,     0,     0,     0,
  504.      0,    18,    19,     0,    20,     0,    51,     0,     0,    22,
  505.     52,    14,    15,    16,    17,     0,     0,     0,     0,     7,
  506.     18,    19,     8,     9,    71,    51,     0,-32768,    22,    52,
  507.      0,     0,     0,     0,     7,     0,     0,     8,     9,-32768,
  508.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  509.     14,    15,     0,     0,     0,     0,    77,    78,    79,    18,
  510.     19,     0,    20,     0,    21,    14,    15,    22,    23,     0,
  511.      0,-32768,-32768,-32768,    18,    19,     0,    20,     0,    21,
  512.      0,     7,    22,    23,     8,     9,   219,     0,     0,-32768,
  513.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  514.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  515.      0,     0,    14,    15,     0,     0,     0,     0,     0,     0,
  516.      0,    18,    19,     0,    20,     0,   171,     0,     0,    22,
  517.     52
  518. };
  519.  
  520. static const short yycheck[] = {     3,
  521.      1,    31,   155,    23,     1,   106,   159,     1,     1,    10,
  522.    111,     4,    13,    68,     4,    32,    36,   144,    10,    23,
  523.     53,    25,    11,     1,   108,     1,     1,    35,    36,    13,
  524.     34,    35,    36,    13,   135,    46,    47,    48,    55,    28,
  525.     51,    42,    43,   170,     1,    49,    50,     4,    52,    13,
  526.     42,    43,    13,     3,     4,    55,   111,    54,    59,    60,
  527.     54,    54,    52,    60,    68,    11,    60,    71,    72,    57,
  528.     74,    75,    76,    77,    78,    59,    54,    51,    82,   180,
  529.     56,    56,    60,    53,    60,    60,    13,    14,    15,    35,
  530.     36,    18,    19,    11,    21,    22,    57,    53,    59,    41,
  531.    104,     5,   106,     4,    53,    28,    31,   111,    49,    50,
  532.     99,   100,     4,   266,    53,    38,    53,    35,    36,    42,
  533.     54,   110,    53,    59,    51,   278,   130,    24,    25,   133,
  534.     47,   135,    32,   217,   218,   219,   220,     4,   222,   223,
  535.    224,    55,    21,     4,    41,   175,    53,     4,    18,   153,
  536.    154,   155,   172,   157,   158,   159,    83,    84,    85,    86,
  537.     87,    88,     0,    18,    19,     0,    21,    22,   172,    25,
  538.    210,   242,   256,   162,   163,    -1,   180,   168,    -1,    -1,
  539.      3,   108,   202,    80,   268,    44,    45,    46,    47,    48,
  540.     -1,    -1,    51,   197,    -1,    -1,    51,   124,   202,    -1,
  541.     97,   231,    25,    -1,    27,    28,    -1,    -1,   105,   213,
  542.    214,   215,   201,    -1,    -1,    38,   113,   144,    -1,    42,
  543.     -1,    21,    -1,    -1,    -1,    -1,    -1,   216,    83,    84,
  544.     85,    86,    87,    88,    -1,    -1,   240,    -1,    -1,    -1,
  545.     -1,    -1,    -1,   170,   171,    -1,    -1,    -1,    -1,   176,
  546.     -1,    -1,    -1,   108,    -1,    -1,   260,    -1,   262,   263,
  547.     -1,    -1,   266,    -1,    -1,    -1,    -1,    -1,    -1,   124,
  548.     -1,    -1,   261,    -1,   278,    -1,    -1,    -1,   267,    -1,
  549.    284,    -1,    -1,   287,    -1,    -1,    -1,   291,    -1,   293,
  550.    217,   218,   219,   220,    -1,   222,   223,   224,   225,    -1,
  551.     -1,    -1,    -1,     4,    -1,    -1,     7,     8,   108,    -1,
  552.     -1,    -1,    -1,    -1,    -1,    -1,   171,    -1,    -1,    -1,
  553.    247,   176,   249,   250,   251,    -1,   253,   254,   255,   256,
  554.    106,    -1,    -1,    -1,    35,    36,    -1,   234,    10,    11,
  555.    237,   268,   269,    44,    45,    -1,    47,    -1,    49,    -1,
  556.     -1,    52,    53,    -1,   281,    -1,    28,    -1,    -1,   135,
  557.    257,    -1,   217,   218,   219,   220,    -1,   222,   223,   224,
  558.    225,   171,    10,    11,    -1,    -1,   176,    -1,    -1,    61,
  559.    277,    -1,   158,    -1,    -1,   282,   283,    -1,    -1,   286,
  560.     28,    -1,   247,   290,   249,   250,   251,    -1,   253,   254,
  561.    255,   256,    -1,    -1,   180,    -1,    -1,    -1,    -1,    -1,
  562.     -1,    -1,    -1,   268,   269,    -1,    -1,   217,   218,   219,
  563.    220,    -1,   222,   223,   224,   225,   281,    99,   100,    -1,
  564.     -1,    -1,   114,    -1,    -1,    -1,    -1,    -1,   110,    -1,
  565.    112,    -1,    -1,    -1,   126,   127,    -1,   247,    -1,   249,
  566.    250,   251,    -1,   253,   254,   255,   256,    -1,    -1,    -1,
  567.     -1,    99,   100,    -1,    -1,    -1,    -1,    -1,   268,   269,
  568.     -1,    -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  569.     -1,   281,    -1,    -1,   260,    -1,   262,    -1,    -1,    -1,
  570.    162,   163,    -1,    -1,    -1,    -1,   168,    -1,    -1,    -1,
  571.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   284,    -1,
  572.     -1,   287,    -1,    -1,    -1,   291,    -1,   293,   200,    -1,
  573.     -1,   203,    -1,    -1,   162,   163,    -1,    -1,    -1,   201,
  574.    212,    -1,    -1,    -1,   206,    -1,    -1,    -1,    -1,     0,
  575.      1,    -1,     3,     4,   216,    -1,     7,     8,   230,    -1,
  576.     -1,    -1,    13,    -1,    15,    16,    -1,    -1,    -1,    -1,
  577.     -1,    -1,    -1,   201,    -1,    -1,    -1,    -1,   240,    30,
  578.     31,    -1,    -1,    -1,    35,    36,    37,    38,   216,    -1,
  579.     -1,    -1,   264,    44,    45,    -1,    47,    -1,    49,   261,
  580.     -1,    52,    53,   265,   276,   267,    57,   279,    -1,    -1,
  581.     -1,    -1,    -1,   285,    -1,    -1,    -1,    -1,    -1,    -1,
  582.     -1,    -1,     1,    -1,     3,     4,    -1,    -1,     7,     8,
  583.     -1,    -1,    -1,   261,    -1,    -1,    -1,    -1,    17,   267,
  584.     19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
  585.     29,    -1,    31,    -1,    -1,    -1,    35,    36,    37,    38,
  586.     -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,     1,
  587.     49,     3,     4,    52,    53,     7,     8,    -1,    57,    58,
  588.     59,    -1,    -1,    -1,    -1,    17,    -1,    19,    20,    21,
  589.     22,    23,    24,    25,    26,    27,    28,    29,    -1,    31,
  590.     -1,    -1,    -1,    35,    36,    37,    38,    -1,    -1,    -1,
  591.     -1,    -1,    44,    45,    -1,    47,     1,    49,     3,     4,
  592.     52,    53,     7,     8,    -1,    57,    58,    59,    -1,    -1,
  593.     -1,    -1,    17,    -1,    19,    20,    21,    22,    23,    24,
  594.     25,    26,    27,    28,    29,    -1,    31,    -1,    -1,    -1,
  595.     35,    36,    37,    38,    -1,    -1,    -1,    -1,    -1,    44,
  596.     45,    -1,    47,    -1,    49,    -1,    -1,    52,    53,    -1,
  597.     -1,    -1,    57,     1,    59,     3,     4,    -1,    -1,     7,
  598.      8,    -1,    10,    -1,    -1,    13,    -1,    -1,    -1,    -1,
  599.     -1,    -1,    -1,    -1,    -1,     4,    -1,    -1,     7,     8,
  600.      9,    -1,    -1,    31,    -1,    -1,    -1,    35,    36,    37,
  601.     38,    -1,    -1,    -1,    42,    43,    44,    45,    -1,    47,
  602.     -1,    49,    -1,    -1,    52,    53,    35,    36,     3,     4,
  603.     -1,    59,     7,     8,     9,    44,    45,    12,    47,    -1,
  604.     49,    -1,    -1,    52,    53,    -1,    -1,    -1,    -1,    -1,
  605.     -1,    -1,    -1,    -1,    -1,    -1,    31,    32,    33,    34,
  606.     35,    36,    37,    38,    39,    -1,    41,    42,    43,    44,
  607.     45,    -1,    47,    -1,    49,     3,     4,    52,    53,     7,
  608.      8,    -1,    -1,    -1,    -1,    60,    -1,    -1,    -1,    17,
  609.     -1,    19,    20,    21,    22,    23,    24,    25,    26,    27,
  610.     28,    29,    -1,    31,    -1,    -1,    -1,    35,    36,    37,
  611.     38,    -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,
  612.     -1,    49,    -1,    -1,    52,    53,    -1,    -1,    -1,    57,
  613.     -1,    59,     3,     4,    -1,    -1,     7,     8,     9,    -1,
  614.     -1,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  615.     -1,    -1,     4,    -1,    -1,     7,     8,    -1,    -1,    -1,
  616.     31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
  617.     41,    42,    43,    44,    45,    -1,    47,    -1,    49,    -1,
  618.     -1,    52,    53,    35,    36,     3,     4,    -1,    59,     7,
  619.      8,     9,    44,    45,    12,    47,    -1,    49,    -1,    -1,
  620.     52,    53,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  621.     -1,    -1,    -1,    31,    32,    33,    34,    35,    36,    37,
  622.     38,    39,    -1,    41,    42,    43,    44,    45,    -1,    47,
  623.      1,    49,     3,     4,    52,    53,     7,     8,    -1,    -1,
  624.     -1,    59,    -1,    -1,    15,    16,    -1,    -1,    -1,    -1,
  625.     -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,    30,
  626.     31,     7,     8,    -1,    35,    36,    37,    38,    -1,    -1,
  627.     -1,    -1,    -1,    44,    45,    -1,    47,    -1,    49,    -1,
  628.     -1,    52,    53,    -1,    -1,    31,    57,    -1,    -1,    35,
  629.     36,    37,    38,    -1,    -1,    -1,    -1,    -1,    44,    45,
  630.     -1,    47,     1,    49,     3,     4,    52,    53,     7,     8,
  631.     -1,    -1,    -1,    59,    -1,    -1,    -1,    -1,    -1,    -1,
  632.     -1,    -1,     1,    -1,     3,     4,    -1,    -1,     7,     8,
  633.     -1,    -1,    31,    -1,    -1,    -1,    35,    36,    37,    38,
  634.     -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,    -1,
  635.     49,    -1,    31,    52,    53,    54,    35,    36,    37,    38,
  636.     -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,     1,
  637.     49,     3,     4,    52,    53,     7,     8,    -1,    -1,    -1,
  638.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     1,    -1,
  639.      3,     4,    -1,    -1,     7,     8,    -1,    -1,    -1,    31,
  640.     -1,    -1,    -1,    35,    36,    37,    38,    -1,    -1,    -1,
  641.     -1,    -1,    44,    45,    -1,    47,    -1,    49,    31,    -1,
  642.     52,    53,    35,    36,    37,    38,    -1,    -1,    -1,    -1,
  643.     -1,    44,    45,    -1,    47,    -1,    49,     3,     4,    52,
  644.     53,     7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,
  645.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  646.     -1,    -1,    -1,    -1,    -1,    31,    32,    33,    34,    35,
  647.     36,    37,    38,    39,    -1,    41,    42,    43,    44,    45,
  648.     -1,    47,    -1,    49,    -1,    -1,    52,    53,    54,     3,
  649.      4,    -1,    -1,     7,     8,     9,    -1,    -1,    12,    -1,
  650.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  651.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,    32,    33,
  652.     34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
  653.     44,    45,    -1,    47,    -1,    49,     3,     4,    52,    53,
  654.      7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,    -1,
  655.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  656.     -1,    -1,    -1,    -1,    31,    32,    33,    34,    35,    36,
  657.     37,    38,    39,    -1,    41,    42,    43,    44,    45,    -1,
  658.     47,    -1,    49,     3,     4,    52,    53,     7,     8,     9,
  659.     -1,    -1,    12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  660.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  661.     -1,    31,    32,    33,    -1,    35,    36,    37,    38,    -1,
  662.     -1,    41,    42,    43,    44,    45,    -1,    47,    -1,    49,
  663.      3,     4,    52,    53,     7,     8,     9,    -1,    -1,    12,
  664.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  665.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,    32,
  666.     33,    34,    35,    36,    37,    38,    39,    40,    -1,    -1,
  667.     -1,    44,    45,    -1,    47,    -1,    49,     3,     4,    52,
  668.     53,     7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,
  669.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  670.     -1,    -1,    -1,    -1,    -1,    31,    32,    -1,    -1,    35,
  671.     36,    37,    38,    -1,    -1,    41,    42,    43,    44,    45,
  672.     -1,    47,    -1,    49,     3,     4,    52,    53,     7,     8,
  673.      9,    -1,    -1,    12,    -1,    -1,    -1,    -1,    -1,    -1,
  674.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  675.     -1,    -1,    31,    32,    33,    34,    35,    36,    37,    38,
  676.     39,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,    -1,
  677.     49,     3,     4,    52,    53,     7,     8,     9,    -1,    -1,
  678.     12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  679.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,
  680.     32,    33,    -1,    35,    36,    37,    38,    -1,    -1,    -1,
  681.     -1,    -1,    44,    45,    -1,    47,    -1,    49,     3,     4,
  682.     52,    53,     7,     8,     9,    -1,    -1,    12,    -1,    -1,
  683.     -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,    -1,
  684.     -1,     7,     8,    -1,    -1,    -1,    31,    32,    -1,    -1,
  685.     35,    36,    37,    38,    -1,    -1,    -1,    -1,    -1,    44,
  686.     45,    -1,    47,    -1,    49,    31,    -1,    52,    53,    35,
  687.     36,    37,    38,    -1,    -1,    -1,    -1,    -1,    44,    45,
  688.     -1,    47,    -1,    49,     3,     4,    52,    53,     7,     8,
  689.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  690.     -1,    -1,    -1,     3,     4,    -1,    -1,     7,     8,    -1,
  691.     -1,    -1,    31,    -1,    -1,    -1,    35,    36,    37,    38,
  692.     -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,    -1,
  693.     49,    31,    -1,    52,    53,    35,    36,    37,    38,    -1,
  694.     -1,    -1,    -1,    -1,    44,    45,    -1,    47,    -1,    49,
  695.      3,     4,    52,    53,     7,     8,    -1,    -1,    -1,    -1,
  696.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
  697.      4,    -1,    -1,     7,     8,    -1,    -1,    -1,    -1,    -1,
  698.     -1,    -1,    35,    36,    37,    38,    -1,    -1,    -1,    -1,
  699.     -1,    44,    45,    -1,    47,    -1,    49,    -1,    -1,    52,
  700.     53,    35,    36,    37,    38,    -1,    -1,    -1,    -1,     4,
  701.     44,    45,     7,     8,     9,    49,    -1,    12,    52,    53,
  702.     -1,    -1,    -1,    -1,     4,    -1,    -1,     7,     8,     9,
  703.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  704.     35,    36,    -1,    -1,    -1,    -1,    41,    42,    43,    44,
  705.     45,    -1,    47,    -1,    49,    35,    36,    52,    53,    -1,
  706.     -1,    41,    42,    43,    44,    45,    -1,    47,    -1,    49,
  707.     -1,     4,    52,    53,     7,     8,     9,    -1,    -1,    12,
  708.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  709.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  710.     -1,    -1,    35,    36,    -1,    -1,    -1,    -1,    -1,    -1,
  711.     -1,    44,    45,    -1,    47,    -1,    49,    -1,    -1,    52,
  712.     53
  713. };
  714. #define YYPURE 1
  715.  
  716. /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
  717. #line 3 "bison.simple"
  718.  
  719. /* Skeleton output parser for bison,
  720.    Copyright (C) 1984 Bob Corbett and Richard Stallman
  721.  
  722.    This program is free software; you can redistribute it and/or modify
  723.    it under the terms of the GNU General Public License as published by
  724.    the Free Software Foundation; either version 1, or (at your option)
  725.    any later version.
  726.  
  727.    This program is distributed in the hope that it will be useful,
  728.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  729.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  730.    GNU General Public License for more details.
  731.  
  732.    You should have received a copy of the GNU General Public License
  733.    along with this program; if not, write to the Free Software
  734.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  735.  
  736.  
  737. #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__)
  738. #include <alloca.h>
  739. #endif
  740.  
  741. /* This is the parser code that is written into each bison parser
  742.   when the %semantic_parser declaration is not specified in the grammar.
  743.   It was written by Richard Stallman by simplifying the hairy parser
  744.   used when %semantic_parser is specified.  */
  745.  
  746. /* Note: there must be only one dollar sign in this file.
  747.    It is replaced by the list of actions, each action
  748.    as one case of the switch.  */
  749.  
  750. #define yyerrok        (yyerrstatus = 0)
  751. #define yyclearin    (yychar = YYEMPTY)
  752. #define YYEMPTY        -2
  753. #define YYEOF        0
  754. #define YYFAIL        goto yyerrlab;
  755. #define YYACCEPT    return(0)
  756. #define YYABORT     return(1)
  757. #define YYERROR        goto yyerrlab
  758.  
  759. #define YYTERROR    1
  760. #define YYERRCODE    256
  761.  
  762. #ifndef YYIMPURE
  763. #define YYLEX        yylex()
  764. #endif
  765.  
  766. #ifndef YYPURE
  767. #define YYLEX        yylex(&yylval, &yylloc)
  768. #endif
  769.  
  770. /* If nonreentrant, generate the variables here */
  771.  
  772. #ifndef YYIMPURE
  773.  
  774. int    yychar;            /*  the lookahead symbol        */
  775. YYSTYPE    yylval;            /*  the semantic value of the        */
  776.                 /*  lookahead symbol            */
  777.  
  778. YYLTYPE yylloc;            /*  location data for the lookahead    */
  779.                 /*  symbol                */
  780.  
  781. int yynerrs;            /*  number of parse errors so far       */
  782. #endif  /* YYIMPURE */
  783.  
  784. #if YYDEBUG != 0
  785. int yydebug;            /*  nonzero means print parse trace    */
  786. /* Since this is uninitialized, it does not stop multiple parsers
  787.    from coexisting.  */
  788. #endif
  789.  
  790. /*  YYMAXDEPTH indicates the initial size of the parser's stacks    */
  791.  
  792. #ifndef    YYMAXDEPTH
  793. #define YYMAXDEPTH 200
  794. #endif
  795.  
  796. /*  YYMAXLIMIT is the maximum size the stacks can grow to
  797.     (effective only if the built-in stack extension method is used).  */
  798.  
  799. #ifndef YYMAXLIMIT
  800. #define YYMAXLIMIT 10000
  801. #endif
  802.  
  803.  
  804. #line 90 "bison.simple"
  805. int
  806. yyparse()
  807. {
  808.   register int yystate;
  809.   register int yyn;
  810.   register short *yyssp;
  811.   register YYSTYPE *yyvsp;
  812.   YYLTYPE *yylsp;
  813.   int yyerrstatus;    /*  number of tokens to shift before error messages enabled */
  814.   int yychar1;        /*  lookahead token as an internal (translated) token number */
  815.  
  816.   short    yyssa[YYMAXDEPTH];    /*  the state stack            */
  817.   YYSTYPE yyvsa[YYMAXDEPTH];    /*  the semantic value stack        */
  818.   YYLTYPE yylsa[YYMAXDEPTH];    /*  the location stack            */
  819.  
  820.   short *yyss = yyssa;        /*  refer to the stacks thru separate pointers */
  821.   YYSTYPE *yyvs = yyvsa;    /*  to allow yyoverflow to reallocate them elsewhere */
  822.   YYLTYPE *yyls = yylsa;
  823.  
  824.   int yymaxdepth = YYMAXDEPTH;
  825.  
  826. #ifndef YYPURE
  827.   int yychar;
  828.   YYSTYPE yylval;
  829.   YYLTYPE yylloc;
  830.   int yynerrs;
  831. #endif
  832.  
  833.   YYSTYPE yyval;        /*  the variable used to return        */
  834.                 /*  semantic values from the action    */
  835.                 /*  routines                */
  836.  
  837.   int yylen;
  838.  
  839. #if YYDEBUG != 0
  840.   if (yydebug)
  841.     fprintf(stderr, "Starting parse\n");
  842. #endif
  843.  
  844.   yystate = 0;
  845.   yyerrstatus = 0;
  846.   yynerrs = 0;
  847.   yychar = YYEMPTY;        /* Cause a token to be read.  */
  848.  
  849.   /* Initialize stack pointers.
  850.      Waste one element of value and location stack
  851.      so that they stay on the same level as the state stack.  */
  852.  
  853.   yyssp = yyss - 1;
  854.   yyvsp = yyvs;
  855.   yylsp = yyls;
  856.  
  857. /* Push a new state, which is found in  yystate  .  */
  858. /* In all cases, when you get here, the value and location stacks
  859.    have just been pushed. so pushing a state here evens the stacks.  */
  860. yynewstate:
  861.  
  862.   *++yyssp = yystate;
  863.  
  864.   if (yyssp >= yyss + yymaxdepth - 1)
  865.     {
  866.       /* Give user a chance to reallocate the stack */
  867.       /* Use copies of these so that the &'s don't force the real ones into memory. */
  868.       YYSTYPE *yyvs1 = yyvs;
  869.       YYLTYPE *yyls1 = yyls;
  870.       short *yyss1 = yyss;
  871.  
  872.       /* Get the current used size of the three stacks, in elements.  */
  873.       int size = yyssp - yyss + 1;
  874.  
  875. #ifdef yyoverflow
  876.       /* Each stack pointer address is followed by the size of
  877.      the data in use in that stack, in bytes.  */
  878.       yyoverflow("parser stack overflow",
  879.          &yyss1, size * sizeof (*yyssp),
  880.          &yyvs1, size * sizeof (*yyvsp),
  881.          &yyls1, size * sizeof (*yylsp),
  882.          &yymaxdepth);
  883.  
  884.       yyss = yyss1; yyvs = yyvs1; yyls = yyls1;
  885. #else /* no yyoverflow */
  886.       /* Extend the stack our own way.  */
  887.       if (yymaxdepth >= YYMAXLIMIT)
  888.     yyerror("parser stack overflow");
  889.       yymaxdepth *= 2;
  890.       if (yymaxdepth > YYMAXLIMIT)
  891.     yymaxdepth = YYMAXLIMIT;
  892.       yyss = (short *) alloca (yymaxdepth * sizeof (*yyssp));
  893.       bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
  894.       yyvs = (YYSTYPE *) alloca (yymaxdepth * sizeof (*yyvsp));
  895.       bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
  896. #ifdef YYLSP_NEEDED
  897.       yyls = (YYLTYPE *) alloca (yymaxdepth * sizeof (*yylsp));
  898.       bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
  899. #endif
  900. #endif /* no yyoverflow */
  901.  
  902.       yyssp = yyss + size - 1;
  903.       yyvsp = yyvs + size - 1;
  904. #ifdef YYLSP_NEEDED
  905.       yylsp = yyls + size - 1;
  906. #endif
  907.  
  908. #if YYDEBUG != 0
  909.       if (yydebug)
  910.     fprintf(stderr, "Stack size increased to %d\n", yymaxdepth);
  911. #endif
  912.  
  913.       if (yyssp >= yyss + yymaxdepth - 1)
  914.     YYABORT;
  915.     }
  916.  
  917. #if YYDEBUG != 0
  918.   if (yydebug)
  919.     fprintf(stderr, "Entering state %d\n", yystate);
  920. #endif
  921.  
  922. /* Do appropriate processing given the current state.  */
  923. /* Read a lookahead token if we need one and don't already have one.  */
  924. yyresume:
  925.  
  926.   /* First try to decide what to do without reference to lookahead token.  */
  927.  
  928.   yyn = yypact[yystate];
  929.   if (yyn == YYFLAG)
  930.     goto yydefault;
  931.  
  932.   /* Not known => get a lookahead token if don't already have one.  */
  933.  
  934.   /* yychar is either YYEMPTY or YYEOF
  935.      or a valid token in external form.  */
  936.  
  937.   if (yychar == YYEMPTY)
  938.     {
  939. #if YYDEBUG != 0
  940.       if (yydebug)
  941.     fprintf(stderr, "Reading a token: ");
  942. #endif
  943.       yychar = YYLEX;
  944.     }
  945.  
  946.   /* Convert token to internal form (in yychar1) for indexing tables with */
  947.  
  948.   if (yychar <= 0)        /* This means end of input. */
  949.     {
  950.       yychar1 = 0;
  951.       yychar = YYEOF;        /* Don't call YYLEX any more */
  952.  
  953. #if YYDEBUG != 0
  954.       if (yydebug)
  955.     fprintf(stderr, "Now at end of input.\n");
  956. #endif
  957.     }
  958.   else
  959.     {
  960.       yychar1 = YYTRANSLATE(yychar);
  961.  
  962. #if YYDEBUG != 0
  963.       if (yydebug)
  964.     fprintf(stderr, "Next token is %d (%s)\n", yychar, yytname[yychar1]);
  965. #endif
  966.     }
  967.  
  968.   yyn += yychar1;
  969.   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
  970.     goto yydefault;
  971.  
  972.   yyn = yytable[yyn];
  973.  
  974.   /* yyn is what to do for this token type in this state.
  975.      Negative => reduce, -yyn is rule number.
  976.      Positive => shift, yyn is new state.
  977.        New state is final state => don't bother to shift,
  978.        just return success.
  979.      0, or most negative number => error.  */
  980.  
  981.   if (yyn < 0)
  982.     {
  983.       if (yyn == YYFLAG)
  984.     goto yyerrlab;
  985.       yyn = -yyn;
  986.       goto yyreduce;
  987.     }
  988.   else if (yyn == 0)
  989.     goto yyerrlab;
  990.  
  991.   if (yyn == YYFINAL)
  992.     YYACCEPT;
  993.  
  994.   /* Shift the lookahead token.  */
  995.  
  996. #if YYDEBUG != 0
  997.   if (yydebug)
  998.     fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
  999. #endif
  1000.  
  1001.   /* Discard the token being shifted unless it is eof.  */
  1002.   if (yychar != YYEOF)
  1003.     yychar = YYEMPTY;
  1004.  
  1005.   *++yyvsp = yylval;
  1006. #ifdef YYLSP_NEEDED
  1007.   *++yylsp = yylloc;
  1008. #endif
  1009.  
  1010.   /* count tokens shifted since error; after three, turn off error status.  */
  1011.   if (yyerrstatus) yyerrstatus--;
  1012.  
  1013.   yystate = yyn;
  1014.   goto yynewstate;
  1015.  
  1016. /* Do the default action for the current state.  */
  1017. yydefault:
  1018.  
  1019.   yyn = yydefact[yystate];
  1020.   if (yyn == 0)
  1021.     goto yyerrlab;
  1022.  
  1023. /* Do a reduction.  yyn is the number of a rule to reduce with.  */
  1024. yyreduce:
  1025.   yylen = yyr2[yyn];
  1026.   yyval = yyvsp[1-yylen]; /* implement default value of the action */
  1027.  
  1028. #if YYDEBUG != 0
  1029.   if (yydebug)
  1030.     {
  1031.       if (yylen == 1)
  1032.     fprintf (stderr, "Reducing 1 value via line %d, ",
  1033.          yyrline[yyn]);
  1034.       else
  1035.     fprintf (stderr, "Reducing %d values via line %d, ",
  1036.          yylen, yyrline[yyn]);
  1037.     }
  1038. #endif
  1039.  
  1040.  
  1041.   switch (yyn) {
  1042.  
  1043. case 1:
  1044. #line 137 "awk.y"
  1045. { expression_value = yyvsp[-1].nodeval; ;
  1046.     break;}
  1047. case 2:
  1048. #line 142 "awk.y"
  1049.             if (yyvsp[0].nodeval != NULL)
  1050.                 yyval.nodeval = yyvsp[0].nodeval;
  1051.             else
  1052.                 yyval.nodeval = NULL;
  1053.             yyerrok;
  1054.         ;
  1055.     break;}
  1056. case 3:
  1057. #line 151 "awk.y"
  1058. {
  1059.             if (yyvsp[0].nodeval == NULL)
  1060.                 yyval.nodeval = yyvsp[-1].nodeval;
  1061.             else if (yyvsp[-1].nodeval == NULL)
  1062.                 yyval.nodeval = yyvsp[0].nodeval;
  1063.             else {
  1064.                 if (yyvsp[-1].nodeval->type != Node_rule_list)
  1065.                     yyvsp[-1].nodeval = node(yyvsp[-1].nodeval, Node_rule_list,
  1066.                         (NODE*)NULL);
  1067.                 yyval.nodeval = append_right (yyvsp[-1].nodeval,
  1068.                    node(yyvsp[0].nodeval, Node_rule_list,(NODE *) NULL));
  1069.             }
  1070.             yyerrok;
  1071.         ;
  1072.     break;}
  1073. case 4:
  1074. #line 165 "awk.y"
  1075. { yyval.nodeval = NULL; ;
  1076.     break;}
  1077. case 5:
  1078. #line 166 "awk.y"
  1079. { yyval.nodeval = NULL; ;
  1080.     break;}
  1081. case 6:
  1082. #line 170 "awk.y"
  1083. { io_allowed = 0; ;
  1084.     break;}
  1085. case 7:
  1086. #line 172 "awk.y"
  1087. {
  1088.         if (begin_block) {
  1089.             if (begin_block->type != Node_rule_list)
  1090.                 begin_block = node(begin_block, Node_rule_list,
  1091.                     (NODE *)NULL);
  1092.             append_right (begin_block, node(
  1093.                 node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval),
  1094.                 Node_rule_list, (NODE *)NULL) );
  1095.         } else
  1096.             begin_block = node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval);
  1097.         yyval.nodeval = NULL;
  1098.         io_allowed = 1;
  1099.         yyerrok;
  1100.       ;
  1101.     break;}
  1102. case 8:
  1103. #line 186 "awk.y"
  1104. { io_allowed = 0; ;
  1105.     break;}
  1106. case 9:
  1107. #line 188 "awk.y"
  1108. {
  1109.         if (end_block) {
  1110.             if (end_block->type != Node_rule_list)
  1111.                 end_block = node(end_block, Node_rule_list,
  1112.                     (NODE *)NULL);
  1113.             append_right (end_block, node(
  1114.                 node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval),
  1115.                 Node_rule_list, (NODE *)NULL));
  1116.         } else
  1117.             end_block = node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval);
  1118.         yyval.nodeval = NULL;
  1119.         io_allowed = 1;
  1120.         yyerrok;
  1121.       ;
  1122.     break;}
  1123. case 10:
  1124. #line 203 "awk.y"
  1125. {
  1126.         msg ("error near line %d: BEGIN blocks must have an action part", lineno);
  1127.         errcount++;
  1128.         yyerrok;
  1129.       ;
  1130.     break;}
  1131. case 11:
  1132. #line 209 "awk.y"
  1133. {
  1134.         msg ("error near line %d: END blocks must have an action part", lineno);
  1135.         errcount++;
  1136.         yyerrok;
  1137.       ;
  1138.     break;}
  1139. case 12:
  1140. #line 215 "awk.y"
  1141. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_rule_node, yyvsp[0].nodeval); yyerrok; ;
  1142.     break;}
  1143. case 13:
  1144. #line 217 "awk.y"
  1145. { yyval.nodeval = node ((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval); yyerrok; ;
  1146.     break;}
  1147. case 14:
  1148. #line 219 "awk.y"
  1149. { if(yyvsp[-1].nodeval) yyval.nodeval = node (yyvsp[-1].nodeval, Node_rule_node, (NODE *)NULL); yyerrok; ;
  1150.     break;}
  1151. case 15:
  1152. #line 221 "awk.y"
  1153. {
  1154.             func_install(yyvsp[-1].nodeval, yyvsp[0].nodeval);
  1155.             yyval.nodeval = NULL;
  1156.             yyerrok;
  1157.         ;
  1158.     break;}
  1159. case 16:
  1160. #line 230 "awk.y"
  1161. { yyval.sval = yyvsp[0].sval; ;
  1162.     break;}
  1163. case 17:
  1164. #line 232 "awk.y"
  1165. { yyval.sval = yyvsp[0].sval; ;
  1166.     break;}
  1167. case 18:
  1168. #line 237 "awk.y"
  1169. {
  1170.             param_counter = 0;
  1171.         ;
  1172.     break;}
  1173. case 19:
  1174. #line 241 "awk.y"
  1175. {
  1176.             yyval.nodeval = append_right(make_param(yyvsp[-4].sval), yyvsp[-2].nodeval);
  1177.             can_return = 1;
  1178.         ;
  1179.     break;}
  1180. case 20:
  1181. #line 249 "awk.y"
  1182. {
  1183.         yyval.nodeval = yyvsp[-1].nodeval;
  1184.         can_return = 0;
  1185.       ;
  1186.     break;}
  1187. case 21:
  1188. #line 258 "awk.y"
  1189. { yyval.nodeval = yyvsp[0].nodeval; ;
  1190.     break;}
  1191. case 22:
  1192. #line 260 "awk.y"
  1193. { yyval.nodeval = mkrangenode ( node(yyvsp[-2].nodeval, Node_cond_pair, yyvsp[0].nodeval) ); ;
  1194.     break;}
  1195. case 23:
  1196. #line 269 "awk.y"
  1197. { ++want_regexp; ;
  1198.     break;}
  1199. case 24:
  1200. #line 271 "awk.y"
  1201. {
  1202.           want_regexp = 0;
  1203.           yyval.nodeval = node((NODE *)NULL,Node_regex,(NODE *)mk_re_parse(yyvsp[-1].sval, 0));
  1204.           yyval.nodeval -> re_case = 0;
  1205.           emalloc (yyval.nodeval -> re_text, char *, strlen(yyvsp[-1].sval)+1, "regexp");
  1206.           strcpy (yyval.nodeval -> re_text, yyvsp[-1].sval);
  1207.         ;
  1208.     break;}
  1209. case 25:
  1210. #line 282 "awk.y"
  1211. {
  1212.             /* empty actions are different from missing actions */
  1213.             yyval.nodeval = node ((NODE *) NULL, Node_illegal, (NODE *) NULL);
  1214.         ;
  1215.     break;}
  1216. case 26:
  1217. #line 287 "awk.y"
  1218. { yyval.nodeval = yyvsp[-2].nodeval ; ;
  1219.     break;}
  1220. case 27:
  1221. #line 292 "awk.y"
  1222. { yyval.nodeval = yyvsp[0].nodeval; ;
  1223.     break;}
  1224. case 28:
  1225. #line 294 "awk.y"
  1226. {
  1227.             if (yyvsp[-1].nodeval == NULL || yyvsp[-1].nodeval->type != Node_statement_list)
  1228.                 yyvsp[-1].nodeval = node(yyvsp[-1].nodeval, Node_statement_list,(NODE *)NULL);
  1229.                 yyval.nodeval = append_right(yyvsp[-1].nodeval,
  1230.                 node( yyvsp[0].nodeval, Node_statement_list, (NODE *)NULL));
  1231.                 yyerrok;
  1232.         ;
  1233.     break;}
  1234. case 29:
  1235. #line 302 "awk.y"
  1236. { yyval.nodeval = NULL; ;
  1237.     break;}
  1238. case 30:
  1239. #line 304 "awk.y"
  1240. { yyval.nodeval = NULL; ;
  1241.     break;}
  1242. case 31:
  1243. #line 309 "awk.y"
  1244. { yyval.nodetypeval = Node_illegal; ;
  1245.     break;}
  1246. case 32:
  1247. #line 311 "awk.y"
  1248. { yyval.nodetypeval = Node_illegal; ;
  1249.     break;}
  1250. case 33:
  1251. #line 317 "awk.y"
  1252. { yyval.nodeval = NULL; ;
  1253.     break;}
  1254. case 34:
  1255. #line 319 "awk.y"
  1256. { yyval.nodeval = NULL; ;
  1257.     break;}
  1258. case 35:
  1259. #line 321 "awk.y"
  1260. { yyval.nodeval = yyvsp[-1].nodeval; ;
  1261.     break;}
  1262. case 36:
  1263. #line 323 "awk.y"
  1264. { yyval.nodeval = yyvsp[0].nodeval; ;
  1265.     break;}
  1266. case 37:
  1267. #line 325 "awk.y"
  1268. { yyval.nodeval = node (yyvsp[-3].nodeval, Node_K_while, yyvsp[0].nodeval); ;
  1269.     break;}
  1270. case 38:
  1271. #line 327 "awk.y"
  1272. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_K_do, yyvsp[-5].nodeval); ;
  1273.     break;}
  1274. case 39:
  1275. #line 329 "awk.y"
  1276. {
  1277.         yyval.nodeval = node (yyvsp[0].nodeval, Node_K_arrayfor, make_for_loop(variable(yyvsp[-5].sval),
  1278.             (NODE *)NULL, variable(yyvsp[-3].sval)));
  1279.       ;
  1280.     break;}
  1281. case 40:
  1282. #line 334 "awk.y"
  1283. {
  1284.         yyval.nodeval = node(yyvsp[0].nodeval, Node_K_for, (NODE *)make_for_loop(yyvsp[-7].nodeval, yyvsp[-5].nodeval, yyvsp[-3].nodeval));
  1285.       ;
  1286.     break;}
  1287. case 41:
  1288. #line 338 "awk.y"
  1289. {
  1290.         yyval.nodeval = node (yyvsp[0].nodeval, Node_K_for,
  1291.             (NODE *)make_for_loop(yyvsp[-6].nodeval, (NODE *)NULL, yyvsp[-3].nodeval));
  1292.       ;
  1293.     break;}
  1294. case 42:
  1295. #line 344 "awk.y"
  1296. { yyval.nodeval = node ((NODE *)NULL, Node_K_break, (NODE *)NULL); ;
  1297.     break;}
  1298. case 43:
  1299. #line 347 "awk.y"
  1300. { yyval.nodeval = node ((NODE *)NULL, Node_K_continue, (NODE *)NULL); ;
  1301.     break;}
  1302. case 44:
  1303. #line 349 "awk.y"
  1304. { yyval.nodeval = node (yyvsp[-3].nodeval, yyvsp[-5].nodetypeval, yyvsp[-1].nodeval); ;
  1305.     break;}
  1306. case 45:
  1307. #line 351 "awk.y"
  1308. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-3].nodetypeval, yyvsp[-1].nodeval); ;
  1309.     break;}
  1310. case 46:
  1311. #line 353 "awk.y"
  1312. { if (! io_allowed) yyerror("next used in BEGIN or END action"); ;
  1313.     break;}
  1314. case 47:
  1315. #line 355 "awk.y"
  1316. { yyval.nodeval = node ((NODE *)NULL, Node_K_next, (NODE *)NULL); ;
  1317.     break;}
  1318. case 48:
  1319. #line 357 "awk.y"
  1320. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_exit, (NODE *)NULL); ;
  1321.     break;}
  1322. case 49:
  1323. #line 359 "awk.y"
  1324. { if (! can_return) yyerror("return used outside function context"); ;
  1325.     break;}
  1326. case 50:
  1327. #line 361 "awk.y"
  1328. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_return, (NODE *)NULL); ;
  1329.     break;}
  1330. case 51:
  1331. #line 363 "awk.y"
  1332. { yyval.nodeval = node (variable(yyvsp[-4].sval), Node_K_delete, yyvsp[-2].nodeval); ;
  1333.     break;}
  1334. case 52:
  1335. #line 365 "awk.y"
  1336. { yyval.nodeval = yyvsp[-1].nodeval; ;
  1337.     break;}
  1338. case 53:
  1339. #line 370 "awk.y"
  1340. { yyval.nodetypeval = yyvsp[0].nodetypeval; ;
  1341.     break;}
  1342. case 54:
  1343. #line 372 "awk.y"
  1344. { yyval.nodetypeval = yyvsp[0].nodetypeval; ;
  1345.     break;}
  1346. case 55:
  1347. #line 377 "awk.y"
  1348. {
  1349.         yyval.nodeval = node(yyvsp[-3].nodeval, Node_K_if, 
  1350.             node(yyvsp[0].nodeval, Node_if_branches, (NODE *)NULL));
  1351.       ;
  1352.     break;}
  1353. case 56:
  1354. #line 383 "awk.y"
  1355. { yyval.nodeval = node (yyvsp[-6].nodeval, Node_K_if,
  1356.                 node (yyvsp[-3].nodeval, Node_if_branches, yyvsp[0].nodeval)); ;
  1357.     break;}
  1358. case 57:
  1359. #line 389 "awk.y"
  1360. { yyval.nodetypeval = NULL; ;
  1361.     break;}
  1362. case 58:
  1363. #line 391 "awk.y"
  1364. { yyval.nodetypeval = NULL; ;
  1365.     break;}
  1366. case 59:
  1367. #line 396 "awk.y"
  1368. { yyval.nodetypeval = NULL; ;
  1369.     break;}
  1370. case 60:
  1371. #line 398 "awk.y"
  1372. { yyval.nodetypeval = NULL; ;
  1373.     break;}
  1374. case 61:
  1375. #line 403 "awk.y"
  1376. { yyval.nodeval = NULL; ;
  1377.     break;}
  1378. case 62:
  1379. #line 405 "awk.y"
  1380. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_input, (NODE *)NULL); ;
  1381.     break;}
  1382. case 63:
  1383. #line 410 "awk.y"
  1384. { yyval.nodeval = NULL; ;
  1385.     break;}
  1386. case 64:
  1387. #line 412 "awk.y"
  1388. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_output, (NODE *)NULL); ;
  1389.     break;}
  1390. case 65:
  1391. #line 414 "awk.y"
  1392. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_append, (NODE *)NULL); ;
  1393.     break;}
  1394. case 66:
  1395. #line 416 "awk.y"
  1396. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_pipe, (NODE *)NULL); ;
  1397.     break;}
  1398. case 67:
  1399. #line 421 "awk.y"
  1400. { yyval.nodeval = NULL; ;
  1401.     break;}
  1402. case 68:
  1403. #line 423 "awk.y"
  1404. { yyval.nodeval = yyvsp[0].nodeval; ;
  1405.     break;}
  1406. case 69:
  1407. #line 428 "awk.y"
  1408. { yyval.nodeval = make_param(yyvsp[0].sval); ;
  1409.     break;}
  1410. case 70:
  1411. #line 430 "awk.y"
  1412. { yyval.nodeval = append_right(yyvsp[-2].nodeval, make_param(yyvsp[0].sval)); yyerrok; ;
  1413.     break;}
  1414. case 71:
  1415. #line 432 "awk.y"
  1416. { yyval.nodeval = NULL; ;
  1417.     break;}
  1418. case 72:
  1419. #line 434 "awk.y"
  1420. { yyval.nodeval = NULL; ;
  1421.     break;}
  1422. case 73:
  1423. #line 436 "awk.y"
  1424. { yyval.nodeval = NULL; ;
  1425.     break;}
  1426. case 74:
  1427. #line 442 "awk.y"
  1428. { yyval.nodeval = NULL; ;
  1429.     break;}
  1430. case 75:
  1431. #line 444 "awk.y"
  1432. { yyval.nodeval = yyvsp[0].nodeval; ;
  1433.     break;}
  1434. case 76:
  1435. #line 449 "awk.y"
  1436. { yyval.nodeval = NULL; ;
  1437.     break;}
  1438. case 77:
  1439. #line 451 "awk.y"
  1440. { yyval.nodeval = yyvsp[0].nodeval; ;
  1441.     break;}
  1442. case 78:
  1443. #line 456 "awk.y"
  1444. { yyval.nodeval = node (yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL); ;
  1445.     break;}
  1446. case 79:
  1447. #line 458 "awk.y"
  1448. {
  1449.         yyval.nodeval = append_right(yyvsp[-2].nodeval,
  1450.             node( yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL));
  1451.         yyerrok;
  1452.       ;
  1453.     break;}
  1454. case 80:
  1455. #line 464 "awk.y"
  1456. { yyval.nodeval = NULL; ;
  1457.     break;}
  1458. case 81:
  1459. #line 466 "awk.y"
  1460. { yyval.nodeval = NULL; ;
  1461.     break;}
  1462. case 82:
  1463. #line 468 "awk.y"
  1464. { yyval.nodeval = NULL; ;
  1465.     break;}
  1466. case 83:
  1467. #line 470 "awk.y"
  1468. { yyval.nodeval = NULL; ;
  1469.     break;}
  1470. case 84:
  1471. #line 475 "awk.y"
  1472. { yyval.nodeval = NULL; ;
  1473.     break;}
  1474. case 85:
  1475. #line 477 "awk.y"
  1476. { yyval.nodeval = yyvsp[0].nodeval; ;
  1477.     break;}
  1478. case 86:
  1479. #line 482 "awk.y"
  1480. { yyval.nodeval = node (yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL); ;
  1481.     break;}
  1482. case 87:
  1483. #line 484 "awk.y"
  1484. {
  1485.             yyval.nodeval = append_right(yyvsp[-2].nodeval,
  1486.                 node( yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL));
  1487.             yyerrok;
  1488.         ;
  1489.     break;}
  1490. case 88:
  1491. #line 490 "awk.y"
  1492. { yyval.nodeval = NULL; ;
  1493.     break;}
  1494. case 89:
  1495. #line 492 "awk.y"
  1496. { yyval.nodeval = NULL; ;
  1497.     break;}
  1498. case 90:
  1499. #line 494 "awk.y"
  1500. { yyval.nodeval = NULL; ;
  1501.     break;}
  1502. case 91:
  1503. #line 496 "awk.y"
  1504. { yyval.nodeval = NULL; ;
  1505.     break;}
  1506. case 92:
  1507. #line 501 "awk.y"
  1508. { want_assign = 0; ;
  1509.     break;}
  1510. case 93:
  1511. #line 503 "awk.y"
  1512. { yyval.nodeval = node (yyvsp[-3].nodeval, yyvsp[-2].nodetypeval, yyvsp[0].nodeval); ;
  1513.     break;}
  1514. case 94:
  1515. #line 505 "awk.y"
  1516. { yyval.nodeval = node (variable(yyvsp[0].sval), Node_in_array, yyvsp[-3].nodeval); ;
  1517.     break;}
  1518. case 95:
  1519. #line 507 "awk.y"
  1520. {
  1521.           yyval.nodeval = node (yyvsp[0].nodeval, Node_K_getline,
  1522.              node (yyvsp[-3].nodeval, Node_redirect_pipein, (NODE *)NULL));
  1523.         ;
  1524.     break;}
  1525. case 96:
  1526. #line 512 "awk.y"
  1527. {
  1528.           /* "too painful to do right" */
  1529.           /*
  1530.           if (! io_allowed && $3 == NULL)
  1531.             yyerror("non-redirected getline illegal inside BEGIN or END action");
  1532.           */
  1533.           yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_getline, yyvsp[0].nodeval);
  1534.         ;
  1535.     break;}
  1536. case 97:
  1537. #line 521 "awk.y"
  1538. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_and, yyvsp[0].nodeval); ;
  1539.     break;}
  1540. case 98:
  1541. #line 523 "awk.y"
  1542. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_or, yyvsp[0].nodeval); ;
  1543.     break;}
  1544. case 99:
  1545. #line 525 "awk.y"
  1546. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1547.     break;}
  1548. case 100:
  1549. #line 527 "awk.y"
  1550. { yyval.nodeval = yyvsp[0].nodeval; ;
  1551.     break;}
  1552. case 101:
  1553. #line 529 "awk.y"
  1554. { yyval.nodeval = node((NODE *) NULL, Node_nomatch, yyvsp[0].nodeval); ;
  1555.     break;}
  1556. case 102:
  1557. #line 531 "awk.y"
  1558. { yyval.nodeval = node (variable(yyvsp[0].sval), Node_in_array, yyvsp[-2].nodeval); ;
  1559.     break;}
  1560. case 103:
  1561. #line 533 "awk.y"
  1562. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1563.     break;}
  1564. case 104:
  1565. #line 535 "awk.y"
  1566. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_less, yyvsp[0].nodeval); ;
  1567.     break;}
  1568. case 105:
  1569. #line 537 "awk.y"
  1570. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_greater, yyvsp[0].nodeval); ;
  1571.     break;}
  1572. case 106:
  1573. #line 539 "awk.y"
  1574. { yyval.nodeval = node(yyvsp[-4].nodeval, Node_cond_exp, node(yyvsp[-2].nodeval, Node_if_branches, yyvsp[0].nodeval));;
  1575.     break;}
  1576. case 107:
  1577. #line 541 "awk.y"
  1578. { yyval.nodeval = yyvsp[0].nodeval; ;
  1579.     break;}
  1580. case 108:
  1581. #line 543 "awk.y"
  1582. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_concat, yyvsp[0].nodeval); ;
  1583.     break;}
  1584. case 109:
  1585. #line 548 "awk.y"
  1586. { want_assign = 0; ;
  1587.     break;}
  1588. case 110:
  1589. #line 550 "awk.y"
  1590. { yyval.nodeval = node (yyvsp[-3].nodeval, yyvsp[-2].nodetypeval, yyvsp[0].nodeval); ;
  1591.     break;}
  1592. case 111:
  1593. #line 552 "awk.y"
  1594. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_and, yyvsp[0].nodeval); ;
  1595.     break;}
  1596. case 112:
  1597. #line 554 "awk.y"
  1598. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_or, yyvsp[0].nodeval); ;
  1599.     break;}
  1600. case 113:
  1601. #line 556 "awk.y"
  1602. {
  1603.           /* "too painful to do right" */
  1604.           /*
  1605.           if (! io_allowed && $3 == NULL)
  1606.             yyerror("non-redirected getline illegal inside BEGIN or END action");
  1607.           */
  1608.           yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_getline, yyvsp[0].nodeval);
  1609.         ;
  1610.     break;}
  1611. case 114:
  1612. #line 565 "awk.y"
  1613. { yyval.nodeval = yyvsp[0].nodeval; ;
  1614.     break;}
  1615. case 115:
  1616. #line 567 "awk.y"
  1617. { yyval.nodeval = node((NODE *) NULL, Node_nomatch, yyvsp[0].nodeval); ;
  1618.     break;}
  1619. case 116:
  1620. #line 569 "awk.y"
  1621. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1622.     break;}
  1623. case 117:
  1624. #line 571 "awk.y"
  1625. { yyval.nodeval = node (variable(yyvsp[0].sval), Node_in_array, yyvsp[-2].nodeval); ;
  1626.     break;}
  1627. case 118:
  1628. #line 573 "awk.y"
  1629. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1630.     break;}
  1631. case 119:
  1632. #line 575 "awk.y"
  1633. { yyval.nodeval = node(yyvsp[-4].nodeval, Node_cond_exp, node(yyvsp[-2].nodeval, Node_if_branches, yyvsp[0].nodeval));;
  1634.     break;}
  1635. case 120:
  1636. #line 577 "awk.y"
  1637. { yyval.nodeval = yyvsp[0].nodeval; ;
  1638.     break;}
  1639. case 121:
  1640. #line 579 "awk.y"
  1641. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_concat, yyvsp[0].nodeval); ;
  1642.     break;}
  1643. case 122:
  1644. #line 584 "awk.y"
  1645. { yyval.nodeval = node (yyvsp[0].nodeval, Node_not,(NODE *) NULL); ;
  1646.     break;}
  1647. case 123:
  1648. #line 586 "awk.y"
  1649. { yyval.nodeval = yyvsp[-1].nodeval; ;
  1650.     break;}
  1651. case 124:
  1652. #line 588 "awk.y"
  1653. { yyval.nodeval = snode (yyvsp[-1].nodeval, Node_builtin, yyvsp[-3].ptrval); ;
  1654.     break;}
  1655. case 125:
  1656. #line 590 "awk.y"
  1657. { yyval.nodeval = snode (yyvsp[-1].nodeval, Node_builtin, yyvsp[-3].ptrval); ;
  1658.     break;}
  1659. case 126:
  1660. #line 592 "awk.y"
  1661. { yyval.nodeval = snode ((NODE *)NULL, Node_builtin, yyvsp[0].ptrval); ;
  1662.     break;}
  1663. case 127:
  1664. #line 594 "awk.y"
  1665. {
  1666.         yyval.nodeval = node (yyvsp[-1].nodeval, Node_func_call, make_string(yyvsp[-3].sval, strlen(yyvsp[-3].sval)));
  1667.       ;
  1668.     break;}
  1669. case 128:
  1670. #line 598 "awk.y"
  1671. { yyval.nodeval = node (yyvsp[0].nodeval, Node_preincrement, (NODE *)NULL); ;
  1672.     break;}
  1673. case 129:
  1674. #line 600 "awk.y"
  1675. { yyval.nodeval = node (yyvsp[0].nodeval, Node_predecrement, (NODE *)NULL); ;
  1676.     break;}
  1677. case 130:
  1678. #line 602 "awk.y"
  1679. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_postincrement, (NODE *)NULL); ;
  1680.     break;}
  1681. case 131:
  1682. #line 604 "awk.y"
  1683. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_postdecrement, (NODE *)NULL); ;
  1684.     break;}
  1685. case 132:
  1686. #line 606 "awk.y"
  1687. { yyval.nodeval = yyvsp[0].nodeval; ;
  1688.     break;}
  1689. case 133:
  1690. #line 608 "awk.y"
  1691. { yyval.nodeval = yyvsp[0].nodeval; ;
  1692.     break;}
  1693. case 134:
  1694. #line 610 "awk.y"
  1695. { yyval.nodeval = yyvsp[0].nodeval; ;
  1696.     break;}
  1697. case 135:
  1698. #line 614 "awk.y"
  1699. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_exp, yyvsp[0].nodeval); ;
  1700.     break;}
  1701. case 136:
  1702. #line 616 "awk.y"
  1703. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_times, yyvsp[0].nodeval); ;
  1704.     break;}
  1705. case 137:
  1706. #line 618 "awk.y"
  1707. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_quotient, yyvsp[0].nodeval); ;
  1708.     break;}
  1709. case 138:
  1710. #line 620 "awk.y"
  1711. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_mod, yyvsp[0].nodeval); ;
  1712.     break;}
  1713. case 139:
  1714. #line 622 "awk.y"
  1715. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_plus, yyvsp[0].nodeval); ;
  1716.     break;}
  1717. case 140:
  1718. #line 624 "awk.y"
  1719. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_minus, yyvsp[0].nodeval); ;
  1720.     break;}
  1721. case 141:
  1722. #line 626 "awk.y"
  1723. { yyval.nodeval = node (yyvsp[0].nodeval, Node_unary_minus, (NODE *)NULL); ;
  1724.     break;}
  1725. case 142:
  1726. #line 628 "awk.y"
  1727. { yyval.nodeval = yyvsp[0].nodeval; ;
  1728.     break;}
  1729. case 143:
  1730. #line 633 "awk.y"
  1731. { yyval.nodeval = NULL; ;
  1732.     break;}
  1733. case 144:
  1734. #line 635 "awk.y"
  1735. { yyval.nodeval = yyvsp[0].nodeval; ;
  1736.     break;}
  1737. case 145:
  1738. #line 640 "awk.y"
  1739. { want_assign = 1; yyval.nodeval = variable (yyvsp[0].sval); ;
  1740.     break;}
  1741. case 146:
  1742. #line 642 "awk.y"
  1743. { want_assign = 1; yyval.nodeval = node (variable(yyvsp[-3].sval), Node_subscript, yyvsp[-1].nodeval); ;
  1744.     break;}
  1745. case 147:
  1746. #line 644 "awk.y"
  1747. { want_assign = 1; yyval.nodeval = node (yyvsp[0].nodeval, Node_field_spec, (NODE *)NULL); ;
  1748.     break;}
  1749. case 149:
  1750. #line 652 "awk.y"
  1751. { yyerrok; ;
  1752.     break;}
  1753. case 150:
  1754. #line 656 "awk.y"
  1755. { yyval.nodetypeval = Node_illegal; yyerrok; ;
  1756.     break;}
  1757. case 153:
  1758. #line 665 "awk.y"
  1759. { yyerrok; ;
  1760.     break;}
  1761. case 154:
  1762. #line 668 "awk.y"
  1763. { yyval.nodetypeval = Node_illegal; yyerrok; ;
  1764.     break;}
  1765. }
  1766.    /* the action file gets copied in in place of this dollarsign */
  1767. #line 327 "bison.simple"
  1768.  
  1769.   yyvsp -= yylen;
  1770.   yyssp -= yylen;
  1771. #ifdef YYLSP_NEEDED
  1772.   yylsp -= yylen;
  1773. #endif
  1774.  
  1775. #if YYDEBUG != 0
  1776.   if (yydebug)
  1777.     {
  1778.       short *ssp1 = yyss - 1;
  1779.       fprintf (stderr, "state stack now");
  1780.       while (ssp1 != yyssp)
  1781.     fprintf (stderr, " %d", *++ssp1);
  1782.       fprintf (stderr, "\n");
  1783.     }
  1784. #endif
  1785.  
  1786.   *++yyvsp = yyval;
  1787.  
  1788. #ifdef YYLSP_NEEDED
  1789.   yylsp++;
  1790.   if (yylen == 0)
  1791.     {
  1792.       yylsp->first_line = yylloc.first_line;
  1793.       yylsp->first_column = yylloc.first_column;
  1794.       yylsp->last_line = (yylsp-1)->last_line;
  1795.       yylsp->last_column = (yylsp-1)->last_column;
  1796.       yylsp->text = 0;
  1797.     }
  1798.   else
  1799.     {
  1800.       yylsp->last_line = (yylsp+yylen-1)->last_line;
  1801.       yylsp->last_column = (yylsp+yylen-1)->last_column;
  1802.     }
  1803. #endif
  1804.  
  1805.   /* Now "shift" the result of the reduction.
  1806.      Determine what state that goes to,
  1807.      based on the state we popped back to
  1808.      and the rule number reduced by.  */
  1809.  
  1810.   yyn = yyr1[yyn];
  1811.  
  1812.   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
  1813.   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
  1814.     yystate = yytable[yystate];
  1815.   else
  1816.     yystate = yydefgoto[yyn - YYNTBASE];
  1817.  
  1818.   goto yynewstate;
  1819.  
  1820. yyerrlab:   /* here on detecting error */
  1821.  
  1822.   if (! yyerrstatus)
  1823.     /* If not already recovering from an error, report this error.  */
  1824.     {
  1825.       ++yynerrs;
  1826.       yyerror("parse error");
  1827.     }
  1828.  
  1829.   if (yyerrstatus == 3)
  1830.     {
  1831.       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
  1832.  
  1833.       /* return failure if at end of input */
  1834.       if (yychar == YYEOF)
  1835.     YYABORT;
  1836.  
  1837. #if YYDEBUG != 0
  1838.       if (yydebug)
  1839.     fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
  1840. #endif
  1841.  
  1842.       yychar = YYEMPTY;
  1843.     }
  1844.  
  1845.   /* Else will try to reuse lookahead token
  1846.      after shifting the error token.  */
  1847.  
  1848.   yyerrstatus = 3;        /* Each real token shifted decrements this */
  1849.  
  1850.   goto yyerrhandle;
  1851.  
  1852. yyerrdefault:  /* current state does not do anything special for the error token. */
  1853.  
  1854. #if 0
  1855.   /* This is wrong; only states that explicitly want error tokens
  1856.      should shift them.  */
  1857.   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
  1858.   if (yyn) goto yydefault;
  1859. #endif
  1860.  
  1861. yyerrpop:   /* pop the current state because it cannot handle the error token */
  1862.  
  1863.   if (yyssp == yyss) YYABORT;
  1864.   yyvsp--;
  1865.   yystate = *--yyssp;
  1866. #ifdef YYLSP_NEEDED
  1867.   yylsp--;
  1868. #endif
  1869.  
  1870. #if YYDEBUG != 0
  1871.   if (yydebug)
  1872.     {
  1873.       short *ssp1 = yyss - 1;
  1874.       fprintf (stderr, "Error: state stack now");
  1875.       while (ssp1 != yyssp)
  1876.     fprintf (stderr, " %d", *++ssp1);
  1877.       fprintf (stderr, "\n");
  1878.     }
  1879. #endif
  1880.  
  1881. yyerrhandle:
  1882.  
  1883.   yyn = yypact[yystate];
  1884.   if (yyn == YYFLAG)
  1885.     goto yyerrdefault;
  1886.  
  1887.   yyn += YYTERROR;
  1888.   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
  1889.     goto yyerrdefault;
  1890.  
  1891.   yyn = yytable[yyn];
  1892.   if (yyn < 0)
  1893.     {
  1894.       if (yyn == YYFLAG)
  1895.     goto yyerrpop;
  1896.       yyn = -yyn;
  1897.       goto yyreduce;
  1898.     }
  1899.   else if (yyn == 0)
  1900.     goto yyerrpop;
  1901.  
  1902.   if (yyn == YYFINAL)
  1903.     YYACCEPT;
  1904.  
  1905. #if YYDEBUG != 0
  1906.   if (yydebug)
  1907.     fprintf(stderr, "Shifting error token, ");
  1908. #endif
  1909.  
  1910.   *++yyvsp = yylval;
  1911. #ifdef YYLSP_NEEDED
  1912.   *++yylsp = yylloc;
  1913. #endif
  1914.  
  1915.   yystate = yyn;
  1916.   goto yynewstate;
  1917. }
  1918. #line 671 "awk.y"
  1919.  
  1920.  
  1921. struct token {
  1922.     char *operator;        /* text to match */
  1923.     NODETYPE value;        /* node type */
  1924.     int class;        /* lexical class */
  1925.     short nostrict;        /* ignore if in strict compatibility mode */
  1926.     NODE *(*ptr) ();    /* function that implements this keyword */
  1927. };
  1928.  
  1929. extern NODE
  1930.     *do_exp(),    *do_getline(),    *do_index(),    *do_length(),
  1931.     *do_sqrt(),    *do_log(),    *do_sprintf(),    *do_substr(),
  1932.     *do_split(),    *do_system(),    *do_int(),    *do_close(),
  1933.     *do_atan2(),    *do_sin(),    *do_cos(),    *do_rand(),
  1934.     *do_srand(),    *do_match(),    *do_tolower(),    *do_toupper(),
  1935.     *do_sub(),    *do_gsub();
  1936.  
  1937. /* Special functions for debugging */
  1938. #ifdef DEBUG
  1939. NODE *do_prvars(), *do_bp();
  1940. #endif
  1941.  
  1942. /* Tokentab is sorted ascii ascending order, so it can be binary searched. */
  1943.  
  1944. static struct token tokentab[] = {
  1945.     { "BEGIN",    Node_illegal,        LEX_BEGIN,    0,    0 },
  1946.     { "END",    Node_illegal,        LEX_END,    0,    0 },
  1947.     { "atan2",    Node_builtin,        LEX_BUILTIN,    0,    do_atan2 },
  1948. #ifdef DEBUG
  1949.     { "bp",        Node_builtin,        LEX_BUILTIN,    0,    do_bp },
  1950. #endif
  1951.     { "break",    Node_K_break,        LEX_BREAK,    0,    0 },
  1952.     { "close",    Node_builtin,        LEX_BUILTIN,    0,    do_close },
  1953.     { "continue",    Node_K_continue,    LEX_CONTINUE,    0,    0 },
  1954.     { "cos",    Node_builtin,        LEX_BUILTIN,    0,    do_cos },
  1955.     { "delete",    Node_K_delete,        LEX_DELETE,    0,    0 },
  1956.     { "do",        Node_K_do,        LEX_DO,        0,    0 },
  1957.     { "else",    Node_illegal,        LEX_ELSE,    0,    0 },
  1958.     { "exit",    Node_K_exit,        LEX_EXIT,    0,    0 },
  1959.     { "exp",    Node_builtin,        LEX_BUILTIN,    0,    do_exp },
  1960.     { "for",    Node_K_for,        LEX_FOR,    0,    0 },
  1961.     { "func",    Node_K_function,    LEX_FUNCTION,    0,    0 },
  1962.     { "function",    Node_K_function,    LEX_FUNCTION,    0,    0 },
  1963.     { "getline",    Node_K_getline,        LEX_GETLINE,    0,    0 },
  1964.     { "gsub",    Node_builtin,        LEX_BUILTIN,    0,    do_gsub },
  1965.     { "if",        Node_K_if,        LEX_IF,        0,    0 },
  1966.     { "in",        Node_illegal,        LEX_IN,        0,    0 },
  1967.     { "index",    Node_builtin,        LEX_BUILTIN,    0,    do_index },
  1968.     { "int",    Node_builtin,        LEX_BUILTIN,    0,    do_int },
  1969.     { "length",    Node_builtin,        LEX_LENGTH,    0,    do_length },
  1970.     { "log",    Node_builtin,        LEX_BUILTIN,    0,    do_log },
  1971.     { "match",    Node_builtin,        LEX_BUILTIN,    0,    do_match },
  1972.     { "next",    Node_K_next,        LEX_NEXT,    0,    0 },
  1973.     { "print",    Node_K_print,        LEX_PRINT,    0,    0 },
  1974.     { "printf",    Node_K_printf,        LEX_PRINTF,    0,    0 },
  1975. #ifdef DEBUG
  1976.     { "prvars",    Node_builtin,        LEX_BUILTIN,    0,    do_prvars },
  1977. #endif
  1978.     { "rand",    Node_builtin,        LEX_BUILTIN,    0,    do_rand },
  1979.     { "return",    Node_K_return,        LEX_RETURN,    0,    0 },
  1980.     { "sin",    Node_builtin,        LEX_BUILTIN,    0,    do_sin },
  1981.     { "split",    Node_builtin,        LEX_BUILTIN,    0,    do_split },
  1982.     { "sprintf",    Node_builtin,        LEX_BUILTIN,    0,    do_sprintf },
  1983.     { "sqrt",    Node_builtin,        LEX_BUILTIN,    0,    do_sqrt },
  1984.     { "srand",    Node_builtin,        LEX_BUILTIN,    0,    do_srand },
  1985.     { "sub",    Node_builtin,        LEX_BUILTIN,    0,    do_sub },
  1986.     { "substr",    Node_builtin,        LEX_BUILTIN,    0,    do_substr },
  1987.     { "system",    Node_builtin,        LEX_BUILTIN,    0,    do_system },
  1988.     { "tolower",    Node_builtin,        LEX_BUILTIN,    0,    do_tolower },
  1989.     { "toupper",    Node_builtin,        LEX_BUILTIN,    0,    do_toupper },
  1990.     { "while",    Node_K_while,        LEX_WHILE,    0,    0 },
  1991. };
  1992.  
  1993. static char *token_start;
  1994.  
  1995. /* VARARGS0 */
  1996. static void yyerror(char *mesg, ...)
  1997. {
  1998.     va_list args;
  1999.     register char *ptr, *beg;
  2000.     char *scan;
  2001.  
  2002.     errcount++;
  2003.     va_start(args,mesg);
  2004.     /* Find the current line in the input file */
  2005.     if (! lexptr) {
  2006.         beg = "(END OF FILE)";
  2007.         ptr = beg + 13;
  2008.     } else {
  2009.         if (*lexptr == '\n' && lexptr != lexptr_begin)
  2010.             --lexptr;
  2011.         for (beg = lexptr; beg != lexptr_begin && *beg != '\n'; --beg)
  2012.             ;
  2013.         /* NL isn't guaranteed */
  2014.         for (ptr = lexptr; *ptr && *ptr != '\n'; ptr++)
  2015.             ;
  2016.         if (beg != lexptr_begin)
  2017.             beg++;
  2018.     }
  2019.     msg("syntax error near line %d:\n%.*s", lineno, ptr - beg, beg);
  2020.     scan = beg;
  2021.     while (scan < token_start)
  2022.         if (*scan++ == '\t')
  2023.             putc('\t', stderr);
  2024.         else
  2025.             putc(' ', stderr);
  2026.     putc('^', stderr);
  2027.     putc(' ', stderr);
  2028.     vfprintf(stderr, mesg, args);
  2029.     putc('\n', stderr);
  2030.     va_end(args);
  2031.     exit(1);
  2032. }
  2033.  
  2034. /*
  2035.  * Parse a C escape sequence.  STRING_PTR points to a variable containing a
  2036.  * pointer to the string to parse.  That pointer is updated past the
  2037.  * characters we use.  The value of the escape sequence is returned. 
  2038.  *
  2039.  * A negative value means the sequence \ newline was seen, which is supposed to
  2040.  * be equivalent to nothing at all. 
  2041.  *
  2042.  * If \ is followed by a null character, we return a negative value and leave
  2043.  * the string pointer pointing at the null character. 
  2044.  *
  2045.  * If \ is followed by 000, we return 0 and leave the string pointer after the
  2046.  * zeros.  A value of 0 does not mean end of string.  
  2047.  */
  2048.  
  2049. int parse_escape(char **string_ptr)
  2050. {
  2051.     register int c = *(*string_ptr)++;
  2052.     register int i;
  2053.     register int count = 0;
  2054.  
  2055.     switch (c) {
  2056.     case 'a':
  2057.         return BELL;
  2058.     case 'b':
  2059.         return '\b';
  2060.     case 'f':
  2061.         return '\f';
  2062.     case 'n':
  2063.         return '\n';
  2064.     case 'r':
  2065.         return '\r';
  2066.     case 't':
  2067.         return '\t';
  2068.     case 'v':
  2069.         return '\v';
  2070.     case '\n':
  2071.         return -2;
  2072.     case 0:
  2073.         (*string_ptr)--;
  2074.         return -1;
  2075.     case '0':
  2076.     case '1':
  2077.     case '2':
  2078.     case '3':
  2079.     case '4':
  2080.     case '5':
  2081.     case '6':
  2082.     case '7':
  2083.         i = c - '0';
  2084.         count = 0;
  2085.         while (++count < 3) {
  2086.             if ((c = *(*string_ptr)++) >= '0' && c <= '7') {
  2087.                 i *= 8;
  2088.                 i += c - '0';
  2089.             } else {
  2090.                 (*string_ptr)--;
  2091.                 break;
  2092.             }
  2093.         }
  2094.         return i;
  2095.     case 'x':
  2096.         i = 0;
  2097.         while (1) {
  2098.             if (isxdigit((c = *(*string_ptr)++))) {
  2099.                 if (isdigit(c))
  2100.                     i += c - '0';
  2101.                 else if (isupper(c))
  2102.                     i += c - 'A' + 10;
  2103.                 else
  2104.                     i += c - 'a' + 10;
  2105.             } else {
  2106.                 (*string_ptr)--;
  2107.                 break;
  2108.             }
  2109.         }
  2110.         return i;
  2111.     default:
  2112.         return c;
  2113.     }
  2114. }
  2115.  
  2116. /*
  2117.  * Read the input and turn it into tokens. Input is now read from a file
  2118.  * instead of from malloc'ed memory. The main program takes a program
  2119.  * passed as a command line argument and writes it to a temp file. Otherwise
  2120.  * the file name is made available in an external variable.
  2121.  */
  2122.  
  2123. static int yylex(void)
  2124. {
  2125.     register int c;
  2126.     register int namelen;
  2127.     register char *tokstart;
  2128.     char *tokkey;
  2129.     static did_newline = 0;    /* the grammar insists that actions end
  2130.                  * with newlines.  This was easier than
  2131.                  * hacking the grammar. */
  2132.     int seen_e = 0;        /* These are for numbers */
  2133.     int seen_point = 0;
  2134.     int esc_seen;
  2135.     extern char **sourcefile;
  2136.     extern int tempsource, numfiles;
  2137.     static int file_opened = 0;
  2138.     static FILE *fin;
  2139.     static char cbuf[BUFSIZ];
  2140.     int low, mid, high;
  2141. #ifdef DEBUG
  2142.     extern int debugging;
  2143. #endif
  2144.  
  2145.     if (! file_opened) {
  2146.         file_opened = 1;
  2147. #ifdef DEBUG
  2148.         if (debugging) {
  2149.             int i;
  2150.  
  2151.             for (i = 0; i <= numfiles; i++)
  2152.                 fprintf (stderr, "sourcefile[%d] = %s\n", i,
  2153.                         sourcefile[i]);
  2154.         }
  2155. #endif
  2156.     nextfile:
  2157.         if ((fin = pathopen (sourcefile[++curinfile])) == NULL)
  2158.             fatal("cannot open `%s' for reading",
  2159.                 sourcefile[curinfile]);
  2160.         *(lexptr = cbuf) = '\0';
  2161.         /*
  2162.          * immediately unlink the tempfile so that it will
  2163.          * go away cleanly if we bomb.
  2164.          */
  2165.         if (tempsource && curinfile == 0)
  2166.             (void) unlink (sourcefile[curinfile]);
  2167.     }
  2168.  
  2169. retry:
  2170.     if (! *lexptr)
  2171.     {
  2172.         if (fgets (cbuf, sizeof cbuf, fin) == NULL) {
  2173.             if (fin != NULL)
  2174.                 fclose (fin);    /* be neat and clean */
  2175.             if (curinfile < numfiles)
  2176.                 goto nextfile;
  2177.             return 0;
  2178.         } else
  2179.             lexptr = lexptr_begin = cbuf;
  2180.     }
  2181.  
  2182.     if (want_regexp) {
  2183.         int in_brack = 0;
  2184.  
  2185.         want_regexp = 0;
  2186.         token_start = tokstart = lexptr;
  2187.         while ((c = *lexptr++) != 0) {
  2188.             switch (c) {
  2189.             case '[':
  2190.                 in_brack = 1;
  2191.                 break;
  2192.             case ']':
  2193.                 in_brack = 0;
  2194.                 break;
  2195.             case '\\':
  2196.                 if (*lexptr++ == '\0') {
  2197.                     yyerror("unterminated regexp ends with \\");
  2198.                     return ERROR;
  2199.                 } else if (lexptr[-1] == '\n')
  2200.                     goto retry;
  2201.                 break;
  2202.             case '/':    /* end of the regexp */
  2203.                 if (in_brack)
  2204.                     break;
  2205.  
  2206.                 lexptr--;
  2207.                 yylval.sval = tokstart;
  2208.                 return REGEXP;
  2209.             case '\n':
  2210.                 lineno++;
  2211.             case '\0':
  2212.                 lexptr--;    /* so error messages work */
  2213.                 yyerror("unterminated regexp");
  2214.                 return ERROR;
  2215.             }
  2216.         }
  2217.     }
  2218.  
  2219.     if (*lexptr == '\n') {
  2220.         lexptr++;
  2221.         lineno++;
  2222.         return NEWLINE;
  2223.     }
  2224.  
  2225.     while (*lexptr == ' ' || *lexptr == '\t')
  2226.         lexptr++;
  2227.  
  2228.     token_start = tokstart = lexptr;
  2229.  
  2230.     switch (c = *lexptr++) {
  2231.     case 0:
  2232.         return 0;
  2233.  
  2234.     case '\n':
  2235.         lineno++;
  2236.         return NEWLINE;
  2237.  
  2238.     case '#':        /* it's a comment */
  2239.         while (*lexptr != '\n' && *lexptr != '\0')
  2240.             lexptr++;
  2241.         goto retry;
  2242.  
  2243.     case '\\':
  2244.         if (*lexptr == '\n') {
  2245.             lineno++;
  2246.             lexptr++;
  2247.             goto retry;
  2248.         } else
  2249.             break;
  2250.     case ')':
  2251.     case ']':
  2252.     case '(':    
  2253.     case '[':
  2254.     case '$':
  2255.     case ';':
  2256.     case ':':
  2257.     case '?':
  2258.  
  2259.         /*
  2260.          * set node type to ILLEGAL because the action should set it
  2261.          * to the right thing 
  2262.          */
  2263.         yylval.nodetypeval = Node_illegal;
  2264.         return c;
  2265.  
  2266.     case '{':
  2267.     case ',':
  2268.         yylval.nodetypeval = Node_illegal;
  2269.         return c;
  2270.  
  2271.     case '*':
  2272.         if (*lexptr == '=') {
  2273.             yylval.nodetypeval = Node_assign_times;
  2274.             lexptr++;
  2275.             return ASSIGNOP;
  2276.         } else if (*lexptr == '*') {    /* make ** and **= aliases
  2277.                          * for ^ and ^= */
  2278.             if (lexptr[1] == '=') {
  2279.                 yylval.nodetypeval = Node_assign_exp;
  2280.                 lexptr += 2;
  2281.                 return ASSIGNOP;
  2282.             } else {
  2283.                 yylval.nodetypeval = Node_illegal;
  2284.                 lexptr++;
  2285.                 return '^';
  2286.             }
  2287.         }
  2288.         yylval.nodetypeval = Node_illegal;
  2289.         return c;
  2290.  
  2291.     case '/':
  2292.         if (want_assign && *lexptr == '=') {
  2293.             yylval.nodetypeval = Node_assign_quotient;
  2294.             lexptr++;
  2295.             return ASSIGNOP;
  2296.         }
  2297.         yylval.nodetypeval = Node_illegal;
  2298.         return c;
  2299.  
  2300.     case '%':
  2301.         if (*lexptr == '=') {
  2302.             yylval.nodetypeval = Node_assign_mod;
  2303.             lexptr++;
  2304.             return ASSIGNOP;
  2305.         }
  2306.         yylval.nodetypeval = Node_illegal;
  2307.         return c;
  2308.  
  2309.     case '^':
  2310.         if (*lexptr == '=') {
  2311.             yylval.nodetypeval = Node_assign_exp;
  2312.             lexptr++;
  2313.             return ASSIGNOP;
  2314.         }
  2315.         yylval.nodetypeval = Node_illegal;
  2316.         return c;
  2317.  
  2318.     case '+':
  2319.         if (*lexptr == '=') {
  2320.             yylval.nodetypeval = Node_assign_plus;
  2321.             lexptr++;
  2322.             return ASSIGNOP;
  2323.         }
  2324.         if (*lexptr == '+') {
  2325.             yylval.nodetypeval = Node_illegal;
  2326.             lexptr++;
  2327.             return INCREMENT;
  2328.         }
  2329.         yylval.nodetypeval = Node_illegal;
  2330.         return c;
  2331.  
  2332.     case '!':
  2333.         if (*lexptr == '=') {
  2334.             yylval.nodetypeval = Node_notequal;
  2335.             lexptr++;
  2336.             return RELOP;
  2337.         }
  2338.         if (*lexptr == '~') {
  2339.             yylval.nodetypeval = Node_nomatch;
  2340.             lexptr++;
  2341.             return MATCHOP;
  2342.         }
  2343.         yylval.nodetypeval = Node_illegal;
  2344.         return c;
  2345.  
  2346.     case '<':
  2347.         if (*lexptr == '=') {
  2348.             yylval.nodetypeval = Node_leq;
  2349.             lexptr++;
  2350.             return RELOP;
  2351.         }
  2352.         yylval.nodetypeval = Node_less;
  2353.         return c;
  2354.  
  2355.     case '=':
  2356.         if (*lexptr == '=') {
  2357.             yylval.nodetypeval = Node_equal;
  2358.             lexptr++;
  2359.             return RELOP;
  2360.         }
  2361.         yylval.nodetypeval = Node_assign;
  2362.         return ASSIGNOP;
  2363.  
  2364.     case '>':
  2365.         if (*lexptr == '=') {
  2366.             yylval.nodetypeval = Node_geq;
  2367.             lexptr++;
  2368.             return RELOP;
  2369.         } else if (*lexptr == '>') {
  2370.             yylval.nodetypeval = Node_redirect_append;
  2371.             lexptr++;
  2372.             return APPEND_OP;
  2373.         }
  2374.         yylval.nodetypeval = Node_greater;
  2375.         return c;
  2376.  
  2377.     case '~':
  2378.         yylval.nodetypeval = Node_match;
  2379.         return MATCHOP;
  2380.  
  2381.     case '}':
  2382.         /*
  2383.          * Added did newline stuff.  Easier than
  2384.          * hacking the grammar
  2385.          */
  2386.         if (did_newline) {
  2387.             did_newline = 0;
  2388.             return c;
  2389.         }
  2390.         did_newline++;
  2391.         --lexptr;
  2392.         return NEWLINE;
  2393.  
  2394.     case '"':
  2395.         esc_seen = 0;
  2396.         while (*lexptr != '\0') {
  2397.             switch (*lexptr++) {
  2398.             case '\\':
  2399.                 esc_seen = 1;
  2400.                 if (*lexptr == '\n')
  2401.                     yyerror("newline in string");
  2402.                 if (*lexptr++ != '\0')
  2403.                     break;
  2404.                 /* fall through */
  2405.             case '\n':
  2406.                 lexptr--;
  2407.                 yyerror("unterminated string");
  2408.                 return ERROR;
  2409.             case '"':
  2410.                 yylval.nodeval = make_str_node(tokstart + 1,
  2411.                         lexptr-tokstart-2, esc_seen);
  2412.                 yylval.nodeval->flags |= PERM;
  2413.                 return YSTRING;
  2414.             }
  2415.         }
  2416.         return ERROR;
  2417.  
  2418.     case '-':
  2419.         if (*lexptr == '=') {
  2420.             yylval.nodetypeval = Node_assign_minus;
  2421.             lexptr++;
  2422.             return ASSIGNOP;
  2423.         }
  2424.         if (*lexptr == '-') {
  2425.             yylval.nodetypeval = Node_illegal;
  2426.             lexptr++;
  2427.             return DECREMENT;
  2428.         }
  2429.         yylval.nodetypeval = Node_illegal;
  2430.         return c;
  2431.  
  2432.     case '0':
  2433.     case '1':
  2434.     case '2':
  2435.     case '3':
  2436.     case '4':
  2437.     case '5':
  2438.     case '6':
  2439.     case '7':
  2440.     case '8':
  2441.     case '9':
  2442.     case '.':
  2443.         /* It's a number */
  2444.         for (namelen = 0; (c = tokstart[namelen]) != '\0'; namelen++) {
  2445.             switch (c) {
  2446.             case '.':
  2447.                 if (seen_point)
  2448.                     goto got_number;
  2449.                 ++seen_point;
  2450.                 break;
  2451.             case 'e':
  2452.             case 'E':
  2453.                 if (seen_e)
  2454.                     goto got_number;
  2455.                 ++seen_e;
  2456.                 if (tokstart[namelen + 1] == '-' ||
  2457.                     tokstart[namelen + 1] == '+')
  2458.                     namelen++;
  2459.                 break;
  2460.             case '0':
  2461.             case '1':
  2462.             case '2':
  2463.             case '3':
  2464.             case '4':
  2465.             case '5':
  2466.             case '6':
  2467.             case '7':
  2468.             case '8':
  2469.             case '9':
  2470.                 break;
  2471.             default:
  2472.                 goto got_number;
  2473.             }
  2474.         }
  2475.  
  2476. got_number:
  2477.         lexptr = tokstart + namelen;
  2478.         /*
  2479.         yylval.nodeval = make_string(tokstart, namelen);
  2480.         (void) force_number(yylval.nodeval);
  2481.         */
  2482.         yylval.nodeval = make_number(atof(tokstart));
  2483.         yylval.nodeval->flags |= PERM;
  2484.         return NUMBER;
  2485.  
  2486.     case '&':
  2487.         if (*lexptr == '&') {
  2488.             yylval.nodetypeval = Node_and;
  2489.             while ((c = *++lexptr) != 0) {
  2490.                 if (c == '#')
  2491.                     while ((c = *++lexptr) != '\n'
  2492.                            && c != '\0')
  2493.                         ;
  2494.                 if (c == '\n')
  2495.                     lineno++;
  2496.                 else if (! isspace(c))
  2497.                     break;
  2498.             }
  2499.             return LEX_AND;
  2500.         }
  2501.         return ERROR;
  2502.  
  2503.     case '|':
  2504.         if (*lexptr == '|') {
  2505.             yylval.nodetypeval = Node_or;
  2506.             while ((c = *++lexptr) != 0) {
  2507.                 if (c == '#')
  2508.                     while ((c = *++lexptr) != '\n'
  2509.                            && c != '\0')
  2510.                         ;
  2511.                 if (c == '\n')
  2512.                     lineno++;
  2513.                 else if (! isspace(c))
  2514.                     break;
  2515.             }
  2516.             return LEX_OR;
  2517.         }
  2518.         yylval.nodetypeval = Node_illegal;
  2519.         return c;
  2520.     }
  2521.  
  2522.     if (c != '_' && ! isalpha(c)) {
  2523.         yyerror("Invalid char '%c' in expression\n", c);
  2524.         return ERROR;
  2525.     }
  2526.  
  2527.     /* it's some type of name-type-thing.  Find its length */
  2528.     for (namelen = 0; is_identchar(tokstart[namelen]); namelen++)
  2529.         /* null */ ;
  2530.     emalloc(tokkey, char *, namelen+1, "yylex");
  2531.     memcpy(tokkey, tokstart, namelen);
  2532.     tokkey[namelen] = '\0';
  2533.  
  2534.     /* See if it is a special token.  */
  2535.     low = 0;
  2536.     high = (sizeof (tokentab) / sizeof (tokentab[0])) - 1;
  2537.     while (low <= high) {
  2538.         int i, c;
  2539.  
  2540.         mid = (low + high) / 2;
  2541.         c = *tokstart - tokentab[mid].operator[0];
  2542.         i = c ? c : strcmp (tokkey, tokentab[mid].operator);
  2543.  
  2544.         if (i < 0) {        /* token < mid */
  2545.             high = mid - 1;
  2546.         } else if (i > 0) {    /* token > mid */
  2547.             low = mid + 1;
  2548.         } else {
  2549.             lexptr = tokstart + namelen;
  2550.             if (strict && tokentab[mid].nostrict)
  2551.                 break;
  2552.             if (tokentab[mid].class == LEX_BUILTIN
  2553.                 || tokentab[mid].class == LEX_LENGTH)
  2554.                 yylval.ptrval = tokentab[mid].ptr;
  2555.             else
  2556.                 yylval.nodetypeval = tokentab[mid].value;
  2557.             return tokentab[mid].class;
  2558.         }
  2559.     }
  2560.  
  2561.     /* It's a name.  See how long it is.  */
  2562.     yylval.sval = tokkey;
  2563.     lexptr = tokstart + namelen;
  2564.     if (*lexptr == '(')
  2565.         return FUNC_CALL;
  2566.     else
  2567.         return NAME;
  2568. }
  2569.  
  2570. static FILE *pathopen (char *file)
  2571. {
  2572.     char *name;
  2573.     FILE *fp;
  2574.  
  2575.     if (strcmp (file, "-") == 0)
  2576.         return (stdin);
  2577.  
  2578.     if (strict)
  2579.         return (fopen (file, "r"));
  2580.  
  2581.     if (getenv ("Awk$Path") == NULL)
  2582.         fp = fopen (file, "r");
  2583.     else
  2584.     {
  2585.         name = malloc (strlen(file) + 5);
  2586.         strcpy (name, "Awk:");
  2587.         strcpy (name + 4, file);
  2588.  
  2589.         fp = devopen (name, "r");
  2590.         free (name);
  2591.  
  2592.         if (fp == NULL)
  2593.             fp = devopen (file, "r");
  2594.     }
  2595.  
  2596.     return (fp);
  2597. }
  2598.  
  2599. static NODE *node_common(NODETYPE op)
  2600. {
  2601.     register NODE *r;
  2602.     extern int numfiles;
  2603.     extern int tempsource;
  2604.     extern char **sourcefile;
  2605.  
  2606.     r = newnode(op);
  2607.     r->source_line = lineno;
  2608.     if (numfiles > -1 && ! tempsource)
  2609.         r->source_file = sourcefile[curinfile];
  2610.     else
  2611.         r->source_file = NULL;
  2612.     return r;
  2613. }
  2614.  
  2615. /*
  2616.  * This allocates a node with defined lnode and rnode. 
  2617.  * This should only be used by yyparse+co while reading in the program 
  2618.  */
  2619. NODE *node(NODE *left, NODETYPE op, NODE *right)
  2620. {
  2621.     register NODE *r;
  2622.  
  2623.     r = node_common(op);
  2624.     r->lnode = left;
  2625.     r->rnode = right;
  2626.     return r;
  2627. }
  2628.  
  2629. /*
  2630.  * This allocates a node with defined subnode and proc
  2631.  * Otherwise like node()
  2632.  */
  2633. static NODE *snode(NODE *subn, NODETYPE op, NODE *(*procp)())
  2634. {
  2635.     register NODE *r;
  2636.  
  2637.     r = node_common(op);
  2638.     r->subnode = subn;
  2639.     r->proc = procp;
  2640.     return r;
  2641. }
  2642.  
  2643. /*
  2644.  * This allocates a Node_line_range node with defined condpair and
  2645.  * zeroes the trigger word to avoid the temptation of assuming that calling
  2646.  * 'node( foo, Node_line_range, 0)' will properly initialize 'triggered'. 
  2647.  */
  2648. /* Otherwise like node() */
  2649. static NODE *mkrangenode(NODE *cpair)
  2650. {
  2651.     register NODE *r;
  2652.  
  2653.     r = newnode(Node_line_range);
  2654.     r->condpair = cpair;
  2655.     r->triggered = 0;
  2656.     return r;
  2657. }
  2658.  
  2659. /* Build a for loop */
  2660. static NODE *make_for_loop(NODE *init, NODE *cond, NODE *incr)
  2661. {
  2662.     register FOR_LOOP_HEADER *r;
  2663.     NODE *n;
  2664.  
  2665.     emalloc(r, FOR_LOOP_HEADER *, sizeof(FOR_LOOP_HEADER), "make_for_loop");
  2666.     n = newnode(Node_illegal);
  2667.     r->init = init;
  2668.     r->cond = cond;
  2669.     r->incr = incr;
  2670.     n->sub.nodep.r.hd = r;
  2671.     return n;
  2672. }
  2673.  
  2674. /*
  2675.  * Install a name in the hash table specified, even if it is already there.
  2676.  * Name stops with first non alphanumeric. Caller must check against
  2677.  * redefinition if that is desired. 
  2678.  */
  2679. NODE *install(NODE **table, char *name, NODE *value)
  2680. {
  2681.     register NODE *hp;
  2682.     register int len, bucket;
  2683.     register char *p;
  2684.  
  2685.     len = 0;
  2686.     p = name;
  2687.     while (is_identchar(*p))
  2688.         p++;
  2689.     len = p - name;
  2690.  
  2691.     hp = newnode(Node_hashnode);
  2692.     bucket = hashf(name, len, HASHSIZE);
  2693.     hp->hnext = table[bucket];
  2694.     table[bucket] = hp;
  2695.     hp->hlength = len;
  2696.     hp->hvalue = value;
  2697.     emalloc(hp->hname, char *, len + 1, "install");
  2698.     memcpy(hp->hname, name, len);
  2699.     hp->hname[len] = '\0';
  2700.     return hp->hvalue;
  2701. }
  2702.  
  2703. /*
  2704.  * find the most recent hash node for name name (ending with first
  2705.  * non-identifier char) installed by install 
  2706.  */
  2707. NODE *lookup(NODE **table, char *name)
  2708. {
  2709.     register char *bp;
  2710.     register NODE *bucket;
  2711.     register int len;
  2712.  
  2713.     for (bp = name; is_identchar(*bp); bp++)
  2714.         ;
  2715.     len = bp - name;
  2716.     bucket = table[hashf(name, len, HASHSIZE)];
  2717.     while (bucket) {
  2718.         if (bucket->hlength == len && STREQN(bucket->hname, name, len))
  2719.             return bucket->hvalue;
  2720.         bucket = bucket->hnext;
  2721.     }
  2722.     return NULL;
  2723. }
  2724.  
  2725. #define HASHSTEP(old, c) ((old << 1) + c)
  2726. #define MAKE_POS(v) (v & ~0x80000000)    /* make number positive */
  2727.  
  2728. /*
  2729.  * return hash function on name.
  2730.  */
  2731. static int hashf(register char *name, register int len, int hashsize)
  2732. {
  2733.     register int r = 0;
  2734.  
  2735.     while (len--)
  2736.         r = HASHSTEP(r, *name++);
  2737.  
  2738.     r = MAKE_POS(r) % hashsize;
  2739.     return r;
  2740. }
  2741.  
  2742. /*
  2743.  * Add new to the rightmost branch of LIST.  This uses n^2 time, so we make
  2744.  * a simple attempt at optimizing it.
  2745.  */
  2746. static NODE *append_right(NODE *list, NODE *new)
  2747. {
  2748.     register NODE *oldlist;
  2749.     static NODE *savefront = NULL, *savetail = NULL;
  2750.  
  2751.     oldlist = list;
  2752.     if (savefront == oldlist) {
  2753.         savetail = savetail->rnode = new;
  2754.         return oldlist;
  2755.     } else
  2756.         savefront = oldlist;
  2757.     while (list->rnode != NULL)
  2758.         list = list->rnode;
  2759.     savetail = list->rnode = new;
  2760.     return oldlist;
  2761. }
  2762.  
  2763. /*
  2764.  * check if name is already installed;  if so, it had better have Null value,
  2765.  * in which case def is added as the value. Otherwise, install name with def
  2766.  * as value. 
  2767.  */
  2768. static void func_install(NODE *params, NODE *def)
  2769. {
  2770.     NODE *r;
  2771.  
  2772.     pop_params(params->rnode);
  2773.     pop_var(params, 0);
  2774.     r = lookup(variables, params->param);
  2775.     if (r != NULL) {
  2776.         fatal("function name `%s' previously defined", params->param);
  2777.     } else
  2778.         (void) install(variables, params->param,
  2779.             node(params, Node_func, def));
  2780. }
  2781.  
  2782. static void pop_var(NODE *np, int freeit)
  2783. {
  2784.     register char *bp;
  2785.     register NODE *bucket, **save;
  2786.     register int len;
  2787.     char *name;
  2788.  
  2789.     name = np->param;
  2790.     for (bp = name; is_identchar(*bp); bp++)
  2791.         ;
  2792.     len = bp - name;
  2793.     save = &(variables[hashf(name, len, HASHSIZE)]);
  2794.     for (bucket = *save; bucket; bucket = bucket->hnext) {
  2795.         if (len == bucket->hlength && STREQN(bucket->hname, name, len)) {
  2796.             *save = bucket->hnext;
  2797.             freenode(bucket);
  2798.             free(bucket->hname);
  2799.             if (freeit)
  2800.                 free(np->param);
  2801.             return;
  2802.         }
  2803.         save = &(bucket->hnext);
  2804.     }
  2805. }
  2806.  
  2807. static void pop_params(NODE *params)
  2808. {
  2809.     register NODE *np;
  2810.  
  2811.     for (np = params; np != NULL; np = np->rnode)
  2812.         pop_var(np, 1);
  2813. }
  2814.  
  2815. static NODE *make_param(char *name)
  2816. {
  2817.     NODE *r;
  2818.  
  2819.     r = newnode(Node_param_list);
  2820.     r->param = name;
  2821.     r->rnode = NULL;
  2822.     r->param_cnt = param_counter++;
  2823.     return (install(variables, name, r));
  2824. }
  2825.  
  2826. /* Name points to a variable name.  Make sure its in the symbol table */
  2827. NODE *variable(char *name)
  2828. {
  2829.     register NODE *r;
  2830.  
  2831.     if ((r = lookup(variables, name)) == NULL)
  2832.         r = install(variables, name,
  2833.             node(Nnull_string, Node_var, (NODE *) NULL));
  2834.     return r;
  2835. }
  2836.